@@ -27,7 +27,6 @@ struct S {
27
27
~S () {}
28
28
};
29
29
30
-
31
30
template <typename T, int length>
32
31
T tmain () {
33
32
T t;
@@ -60,6 +59,15 @@ T tmain() {
60
59
}
61
60
62
61
extern S<float > **foo ();
62
+ int g_arr[10 ];
63
+
64
+ void reductionArrayElement () {
65
+ #pragma omp parallel
66
+ #pragma omp for reduction(+:g_arr[1])
67
+ for (int i = 0 ; i < 10 ; i++) {
68
+ g_arr[1 ] += i;
69
+ }
70
+ }
63
71
64
72
int main () {
65
73
#ifdef LAMBDA
@@ -164,6 +172,7 @@ int main() {
164
172
#pragma omp for reduction(& : var3)
165
173
for (int i = 0 ; i < 10 ; ++i)
166
174
;
175
+ reductionArrayElement ();
167
176
return tmain<int , 42 >();
168
177
#endif
169
178
}
@@ -535,6 +544,26 @@ int main() {
535
544
// .
536
545
// CHECK4: @.gomp_critical_user_.reduction.var = common global [8 x i32] zeroinitializer, align 8
537
546
// .
547
+
548
+ // CHECK1-LABEL: define {{.*}}reductionArrayElement{{.*}}.omp_outlined{{.*}}
549
+ // CHECK1-NEXT: entry:
550
+ // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
551
+ // CHECK1: [[G_ARR:%.*]] = alloca i32, align 4
552
+ // CHECK1: [[TMP0:%.*]] = sdiv exact i64 sub (i64 ptrtoint (ptr @g_arr to i64){{.*}}
553
+ // CHECK1-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[G_ARR:%.*]], i64 [[TMP0]]
554
+ // CHECK1: omp.inner.for.body:
555
+ // CHECK1: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], ptr [[TMP1]], i64 0, i64 1
556
+ // CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
557
+ // CHECK1-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]],{{.+}}
558
+ // CHECK1-NEXT: store i32 [[ADD2]], ptr [[ARRAYIDX]], align 4
559
+ // CHECK1: omp.loop.exit:
560
+ // CHECK1-NEXT: call void {{.*}}__kmpc_for_static_fini{{.+}}
561
+ // CHECK1: {{.*}}call i32 {{.*}}__kmpc_reduce{{.+}}
562
+ // CHECK1: omp.reduction.default:
563
+ // CHECK1-NEXT: call void @__kmpc_barrier{{.+}}
564
+ // CHECK1-NEXT: ret void
565
+ //
566
+
538
567
// CHECK1-LABEL: define {{[^@]+}}@main
539
568
// CHECK1-SAME: () #[[ATTR0:[0-9]+]] {
540
569
// CHECK1-NEXT: entry:
@@ -614,6 +643,7 @@ int main() {
614
643
// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 1, ptr @main.omp_outlined.11, ptr [[TMP7]])
615
644
// CHECK1-NEXT: [[TMP8:%.*]] = load ptr, ptr [[VAR3]], align 8
616
645
// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 1, ptr @main.omp_outlined.12, ptr [[TMP8]])
646
+ // CHECK1-NEXT: call void {{.*}}reductionArrayElement{{.*}}
617
647
// CHECK1-NEXT: [[CALL10:%.*]] = call noundef i32 @_Z5tmainIiLi42EET_v()
618
648
// CHECK1-NEXT: store i32 [[CALL10]], ptr [[RETVAL]], align 4
619
649
// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[SAVED_STACK]], align 8
0 commit comments