Skip to content

Commit 6559fcc

Browse files
committed
Add missing tests for shaping expr. dependencies and reduction ast-print
1 parent 7025be6 commit 6559fcc

File tree

2 files changed

+194
-0
lines changed

2 files changed

+194
-0
lines changed

clang/test/OmpSs/IR/task_depend_array_shaping.c

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,3 +278,116 @@ void foo4(int x, int y, int z) {
278278
#pragma oss task inout([c]([a][b]vla[sizeof(vla)]))
279279
{}
280280
}
281+
282+
// CHECK: %9 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"(i32* %vla), "QUAL.OSS.VLA.DIMS"(i32* %vla, i64 %1, i64 %3, i64 %5), "QUAL.OSS.FIRSTPRIVATE"(i32* %a), "QUAL.OSS.FIRSTPRIVATE"(i32* %b), "QUAL.OSS.CAPTURED"(i64 %1, i64 %3, i64 %5), "QUAL.OSS.DEP.INOUT"(i32* %vla, %struct._depend_unpack_t.9 (i32*, i32*, i32*, i64, i64, i64)* @compute_dep.10, i32* %vla, i32* %a, i32* %b, i64 %1, i64 %3, i64 %5) ]
283+
// CHECK: %10 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"(i32* %vla), "QUAL.OSS.VLA.DIMS"(i32* %vla, i64 %1, i64 %3, i64 %5), "QUAL.OSS.FIRSTPRIVATE"(i32* %a), "QUAL.OSS.FIRSTPRIVATE"(i32* %b), "QUAL.OSS.FIRSTPRIVATE"(i32* %c), "QUAL.OSS.CAPTURED"(i64 %1, i64 %3, i64 %5), "QUAL.OSS.DEP.INOUT"(i32* %vla, %struct._depend_unpack_t.10 (i32*, i32*, i32*, i32*, i64, i64, i64)* @compute_dep.11, i32* %vla, i32* %a, i32* %b, i32* %c, i64 %1, i64 %3, i64 %5) ]
284+
// CHECK: %11 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"(i32* %vla), "QUAL.OSS.VLA.DIMS"(i32* %vla, i64 %1, i64 %3, i64 %5), "QUAL.OSS.FIRSTPRIVATE"(i32* %a), "QUAL.OSS.FIRSTPRIVATE"(i32* %b), "QUAL.OSS.FIRSTPRIVATE"(i32* %c), "QUAL.OSS.CAPTURED"(i64 %1, i64 %3, i64 %5), "QUAL.OSS.DEP.INOUT"(i32* %vla, %struct._depend_unpack_t.11 (i32*, i32*, i32*, i32*, i64, i64, i64)* @compute_dep.12, i32* %vla, i32* %a, i32* %b, i32* %c, i64 %1, i64 %3, i64 %5) ]
285+
286+
// CHECK: define internal %struct._depend_unpack_t.9 @compute_dep.10(i32* %vla, i32* %a, i32* %b, i64 %0, i64 %1, i64 %2) {
287+
// CHECK-NEXT: entry:
288+
// CHECK-NEXT: %return.val = alloca %struct._depend_unpack_t.9, align 8
289+
// CHECK-NEXT: %3 = load i32, i32* %b, align 4
290+
// CHECK-NEXT: %4 = sext i32 %3 to i64
291+
// CHECK-NEXT: %5 = add i64 %4, 1
292+
// CHECK-NEXT: %6 = mul nuw i64 %1, %2
293+
// CHECK-NEXT: %7 = mul nsw i64 2, %6
294+
// CHECK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %vla, i64 %7
295+
// CHECK-NEXT: %8 = load i32, i32* %a, align 4
296+
// CHECK-NEXT: %9 = zext i32 %8 to i64
297+
// CHECK-NEXT: %10 = mul i64 %2, 4
298+
// CHECK-NEXT: %11 = mul i64 %2, 4
299+
// CHECK-NEXT: %12 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 0
300+
// CHECK-NEXT: store i32* %arrayidx, i32** %12, align 8
301+
// CHECK-NEXT: %13 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 1
302+
// CHECK-NEXT: store i64 %10, i64* %13, align 8
303+
// CHECK-NEXT: %14 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 2
304+
// CHECK-NEXT: store i64 0, i64* %14, align 8
305+
// CHECK-NEXT: %15 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 3
306+
// CHECK-NEXT: store i64 %11, i64* %15, align 8
307+
// CHECK-NEXT: %16 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 4
308+
// CHECK-NEXT: store i64 %9, i64* %16, align 8
309+
// CHECK-NEXT: %17 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 5
310+
// CHECK-NEXT: store i64 %4, i64* %17, align 8
311+
// CHECK-NEXT: %18 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 6
312+
// CHECK-NEXT: store i64 %5, i64* %18, align 8
313+
// CHECK-NEXT: %19 = load %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, align 8
314+
// CHECK-NEXT: ret %struct._depend_unpack_t.9 %19
315+
// CHECK-NEXT: }
316+
317+
// CHECK: define internal %struct._depend_unpack_t.10 @compute_dep.11(i32* %vla, i32* %a, i32* %b, i32* %c, i64 %0, i64 %1, i64 %2) {
318+
// CHECK-NEXT: entry:
319+
// CHECK-NEXT: %return.val = alloca %struct._depend_unpack_t.10, align 8
320+
// CHECK-NEXT: %3 = load i32, i32* %c, align 4
321+
// CHECK-NEXT: %4 = zext i32 %3 to i64
322+
// CHECK-NEXT: %5 = load i32, i32* %b, align 4
323+
// CHECK-NEXT: %6 = zext i32 %5 to i64
324+
// CHECK-NEXT: %7 = mul i64 %2, 4
325+
// CHECK-NEXT: %8 = mul i64 %2, 4
326+
// CHECK-NEXT: %9 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 0
327+
// CHECK-NEXT: store i32* %vla, i32** %9, align 8
328+
// CHECK-NEXT: %10 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 1
329+
// CHECK-NEXT: store i64 %7, i64* %10, align 8
330+
// CHECK-NEXT: %11 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 2
331+
// CHECK-NEXT: store i64 0, i64* %11, align 8
332+
// CHECK-NEXT: %12 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 3
333+
// CHECK-NEXT: store i64 %8, i64* %12, align 8
334+
// CHECK-NEXT: %13 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 4
335+
// CHECK-NEXT: store i64 %1, i64* %13, align 8
336+
// CHECK-NEXT: %14 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 5
337+
// CHECK-NEXT: store i64 0, i64* %14, align 8
338+
// CHECK-NEXT: %15 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 6
339+
// CHECK-NEXT: store i64 %1, i64* %15, align 8
340+
// CHECK-NEXT: %16 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 7
341+
// CHECK-NEXT: store i64 %6, i64* %16, align 8
342+
// CHECK-NEXT: %17 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 8
343+
// CHECK-NEXT: store i64 0, i64* %17, align 8
344+
// CHECK-NEXT: %18 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 9
345+
// CHECK-NEXT: store i64 %6, i64* %18, align 8
346+
// CHECK-NEXT: %19 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 10
347+
// CHECK-NEXT: store i64 %4, i64* %19, align 8
348+
// CHECK-NEXT: %20 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 11
349+
// CHECK-NEXT: store i64 0, i64* %20, align 8
350+
// CHECK-NEXT: %21 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 12
351+
// CHECK-NEXT: store i64 %4, i64* %21, align 8
352+
// CHECK-NEXT: %22 = load %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, align 8
353+
// CHECK-NEXT: ret %struct._depend_unpack_t.10 %22
354+
// CHECK-NEXT: }
355+
356+
// CHECK: define internal %struct._depend_unpack_t.11 @compute_dep.12(i32* %vla, i32* %a, i32* %b, i32* %c, i64 %0, i64 %1, i64 %2) {
357+
// CHECK-NEXT: entry:
358+
// CHECK-NEXT: %return.val = alloca %struct._depend_unpack_t.11, align 8
359+
// CHECK-NEXT: %3 = mul nuw i64 %0, %1
360+
// CHECK-NEXT: %4 = mul nuw i64 %3, %2
361+
// CHECK-NEXT: %5 = mul nuw i64 4, %4
362+
// CHECK-NEXT: %6 = mul nuw i64 %1, %2
363+
// CHECK-NEXT: %7 = mul nsw i64 %5, %6
364+
// CHECK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %vla, i64 %7
365+
// CHECK-NEXT: %8 = load i32, i32* %c, align 4
366+
// CHECK-NEXT: %9 = zext i32 %8 to i64
367+
// CHECK-NEXT: %10 = load i32, i32* %b, align 4
368+
// CHECK-NEXT: %11 = zext i32 %10 to i64
369+
// CHECK-NEXT: %12 = mul i64 %2, 4
370+
// CHECK-NEXT: %13 = mul i64 %2, 4
371+
// CHECK-NEXT: %14 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 0
372+
// CHECK-NEXT: store i32* %arrayidx, i32** %14, align 8
373+
// CHECK-NEXT: %15 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 1
374+
// CHECK-NEXT: store i64 %12, i64* %15, align 8
375+
// CHECK-NEXT: %16 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 2
376+
// CHECK-NEXT: store i64 0, i64* %16, align 8
377+
// CHECK-NEXT: %17 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 3
378+
// CHECK-NEXT: store i64 %13, i64* %17, align 8
379+
// CHECK-NEXT: %18 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 4
380+
// CHECK-NEXT: store i64 %11, i64* %18, align 8
381+
// CHECK-NEXT: %19 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 5
382+
// CHECK-NEXT: store i64 0, i64* %19, align 8
383+
// CHECK-NEXT: %20 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 6
384+
// CHECK-NEXT: store i64 %11, i64* %20, align 8
385+
// CHECK-NEXT: %21 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 7
386+
// CHECK-NEXT: store i64 %9, i64* %21, align 8
387+
// CHECK-NEXT: %22 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 8
388+
// CHECK-NEXT: store i64 0, i64* %22, align 8
389+
// CHECK-NEXT: %23 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 9
390+
// CHECK-NEXT: store i64 %9, i64* %23, align 8
391+
// CHECK-NEXT: %24 = load %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, align 8
392+
// CHECK-NEXT: ret %struct._depend_unpack_t.11 %24
393+
// CHECK-NEXT: }
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// RUN: %clang_cc1 -verify -fompss-2 -ast-print %s | FileCheck %s
2+
3+
// expected-no-diagnostics
4+
5+
#ifndef HEADER
6+
#define HEADER
7+
8+
template <typename T>
9+
void bar(T &x, T &y) { x.a += y.a; }
10+
11+
namespace N1
12+
{
13+
struct A { int a; };
14+
#pragma oss declare reduction(+: A : bar(omp_out, omp_in))
15+
};
16+
17+
#pragma oss declare reduction(+ : int, char : omp_out *= omp_in)
18+
// CHECK: #pragma oss declare reduction (+ : int : omp_out *= omp_in){{$}}
19+
// CHECK-NEXT: #pragma oss declare reduction (+ : char : omp_out *= omp_in)
20+
21+
template <class T>
22+
class SSS {
23+
public:
24+
#pragma oss declare reduction(fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)
25+
// CHECK: #pragma oss declare reduction (fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)
26+
// CHECK: #pragma oss declare reduction (fun : int : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)
27+
};
28+
29+
SSS<int> d;
30+
31+
void init(SSS<int> &lhs, SSS<int> rhs);
32+
33+
#pragma oss declare reduction(fun : SSS < int > : omp_out = omp_in) initializer(init(omp_priv, omp_orig))
34+
// CHECK: #pragma oss declare reduction (fun : SSS<int> : omp_out = omp_in) initializer(init(omp_priv, omp_orig))
35+
36+
// CHECK: template <typename T> T foo(T a) {
37+
// CHECK: #pragma oss declare reduction (fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15);
38+
// CHECK: {
39+
// CHECK: #pragma oss declare reduction (fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15);
40+
// CHECK: }
41+
// CHECK: return a;
42+
// CHECK: }
43+
44+
// CHECK: template<> int foo<int>(int a) {
45+
// CHECK: #pragma oss declare reduction (fun : int : omp_out += omp_in) initializer(omp_priv = omp_orig + 15);
46+
// CHECK: {
47+
// CHECK: #pragma oss declare reduction (fun : int : omp_out += omp_in) initializer(omp_priv = omp_orig + 15);
48+
// CHECK: }
49+
// CHECK: return a;
50+
// CHECK: }
51+
template <typename T>
52+
T foo(T a) {
53+
#pragma oss declare reduction(fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)
54+
{
55+
#pragma oss declare reduction(fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15)
56+
}
57+
return a;
58+
}
59+
60+
int main() {
61+
int i = 0;
62+
SSS<int> sss;
63+
// TODO: Add support for scoped reduction identifiers
64+
// #pragma oss task reduction(SSS<int>::fun : i)
65+
// TODO-CHECK: #pragma oss task reduction(SSS<int>::fun: i)
66+
{
67+
i += 1;
68+
}
69+
// #pragma oss task reduction(::fun:sss)
70+
// TODO-CHECK: #pragma oss task reduction(::fun: sss)
71+
{
72+
}
73+
N1::A a;
74+
// CHECK: #pragma oss task reduction(+: a)
75+
#pragma oss task reduction(+: a)
76+
{
77+
}
78+
return foo(15);
79+
}
80+
81+
#endif

0 commit comments

Comments
 (0)