Skip to content

Commit 0d20c87

Browse files
authored
[OMPIRBuilder] Pass work loop type in ident flags (llvm#189347)
Flang uses the OMPIRBuilder to lower OpenMP constructs to LLVM IR. When dealing with work sharing constructs, such as DO, DISTRIBUTE or SECTIONS/SECTION, OMPIRBuilder needs to construct the call to the OpenMP runtime, typically `__kmpc_for_static_init` or `__kmpc_dist_for_static_init`. The first passed flag to these functions is the `ident_t` struct, defined in `kmp.h`. Most of the arguments are reserved for usage in Fortran and unused in `openmp`. However, the `flags` argument is used throughout the code base to identify specific constructs, such as the type of work sharing construct. In llvm#112545, it was identified that Flang does not provide the correct `ident_t` flags when calling into e.g. `__kmpc_for_static_init`, causing the following runtime warning to appear when the OpenMP Tools Interface is used: ``` OMP: Warning rust-lang#189: OMPT: Cannot determine workshare type; using the default (loop) instead. This issue is fixed in an up-to-date compiler. ``` This PR adds a test, verifying that the work sharing constructs provide the correct flags to the runtime call. The IR check for SECTIONS/SECTION maps against `KMP_IDENT_WORK_LOOP`, as the OMPIRBuilder converts the SECTIONS construct into a DO loop with a switch-case for every SECTION clause. In addition, `OMPIRBuilder` is modified, so that the work loop type is passed via `ident_t.flags` to the respective `__kmpc_for_static_init`/`__kmpc_dist_for_static_init` calls, letting the test pass and the `libomp` warning disappear. Wherever possible, provide the mapping based on the passed `LoopType`. If not available, I implemented the decision based on the `DistScheduleSchedType`, or in case of `applyDynamicWorkshareLoop`, hard-coded this to `OMP_IDENT_FLAG_WORK_LOOP`. --- As this is the first time dealing with `OMPIRBuilder`, I'm not sure if I missed anything while implementing these changes. If there's anything that can be improved here, e.g. with the ident flag mapping, I'm very grateful for any feedback. I tried to implement this with the best of my understanding based on taking a look at the existing code and tests. For example, I was not sure if adding a test to `flang/test/Integration/OpenMP/` is the correct approach here, or if I rather should try to modify `unittests/Frontend/OpenMPIRBuilderTest.cpp`. In the end, the former looked to me more straight-forward. --- Fixes llvm#112545 --------- Signed-off-by: Jan André Reuter <j.reuter@fz-juelich.de>
1 parent 356f2fc commit 0d20c87

29 files changed

Lines changed: 1717 additions & 1609 deletions

clang/test/OpenMP/cancel_codegen.cpp

Lines changed: 50 additions & 50 deletions
Large diffs are not rendered by default.

clang/test/OpenMP/irbuilder_for_iterator.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ extern "C" void workshareloop_iterator(float *a, float *b, float *c) {
5757
// CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[DOTCOUNT]], 1
5858
// CHECK-NEXT: store i64 [[TMP1]], ptr [[P_UPPERBOUND]], align 8
5959
// CHECK-NEXT: store i64 1, ptr [[P_STRIDE]], align 8
60-
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])
61-
// CHECK-NEXT: call void @__kmpc_for_static_init_8u(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i64 1, i64 0)
60+
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]])
61+
// CHECK-NEXT: call void @__kmpc_for_static_init_8u(ptr @[[GLOB1:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i64 1, i64 0)
6262
// CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[P_LOWERBOUND]], align 8
6363
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[P_UPPERBOUND]], align 8
6464
// CHECK-NEXT: [[TMP4:%.*]] = sub i64 [[TMP3]], [[TMP2]]
@@ -97,8 +97,8 @@ extern "C" void workshareloop_iterator(float *a, float *b, float *c) {
9797
// CHECK-NEXT: br label [[OMP_LOOP_HEADER]]
9898
// CHECK: omp_loop.exit:
9999
// CHECK-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
100-
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
101-
// CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
100+
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
101+
// CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
102102
// CHECK-NEXT: br label [[OMP_LOOP_AFTER:%.*]]
103103
// CHECK: omp_loop.after:
104104
// CHECK-NEXT: ret void
@@ -116,7 +116,7 @@ extern "C" void workshareloop_iterator(float *a, float *b, float *c) {
116116
// CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8
117117
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8
118118
// CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON:%.*]], ptr [[TMP0]], i32 0, i32 0
119-
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8
119+
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2:![0-9]+]]
120120
// CHECK-NEXT: call void @_ZN10MyIteratorC1ERKS_(ptr noundef nonnull align 1 dereferenceable(1) [[DOTSTART]], ptr noundef nonnull align 1 dereferenceable(1) [[TMP2]])
121121
// CHECK-NEXT: call void @_ZN10MyIteratorC1Ej(ptr noundef nonnull align 1 dereferenceable(1) [[DOTSTOP]], i32 noundef 41)
122122
// CHECK-NEXT: store i64 1, ptr [[DOTSTEP]], align 8
@@ -138,7 +138,7 @@ extern "C" void workshareloop_iterator(float *a, float *b, float *c) {
138138
// CHECK-NEXT: br label [[COND_END]]
139139
// CHECK: cond.end:
140140
// CHECK-NEXT: [[COND:%.*]] = phi i64 [ [[DIV]], [[COND_TRUE]] ], [ [[DIV3]], [[COND_FALSE]] ]
141-
// CHECK-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8
141+
// CHECK-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3:![0-9]+]]
142142
// CHECK-NEXT: store i64 [[COND]], ptr [[TMP6]], align 8
143143
// CHECK-NEXT: ret void
144144
//
@@ -158,7 +158,7 @@ extern "C" void workshareloop_iterator(float *a, float *b, float *c) {
158158
// CHECK-NEXT: [[MUL:%.*]] = mul i64 1, [[TMP1]]
159159
// CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[MUL]] to i32
160160
// CHECK-NEXT: call void @_ZNK10MyIteratorplEj(ptr dead_on_unwind writable sret([[STRUCT_MYITERATOR]]) align 1 [[REF_TMP]], ptr noundef nonnull align 1 dereferenceable(1) [[TMP0]], i32 noundef [[CONV]])
161-
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8
161+
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]]
162162
// CHECK-NEXT: [[CALL:%.*]] = call noundef nonnull align 1 dereferenceable(1) ptr @_ZN10MyIteratoraSERKS_(ptr noundef nonnull align 1 dereferenceable(1) [[TMP2]], ptr noundef nonnull align 1 dereferenceable(1) [[REF_TMP]])
163163
// CHECK-NEXT: ret void
164164
//

clang/test/OpenMP/irbuilder_for_rangefor.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ extern "C" void workshareloop_rangefor(float *a, float *b, float *c) {
5656
// CHECK-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 8
5757
// CHECK-NEXT: call void @_ZN7MyRangeC1Ei(ptr noundef nonnull align 1 dereferenceable(1) [[REF_TMP]], i32 noundef 42)
5858
// CHECK-NEXT: store ptr [[REF_TMP]], ptr [[__RANGE2]], align 8
59-
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__RANGE2]], align 8
59+
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__RANGE2]], align 8, !nonnull [[META2:![0-9]+]]
6060
// CHECK-NEXT: call void @_ZN7MyRange5beginEv(ptr dead_on_unwind writable sret([[STRUCT_MYITERATOR]]) align 1 [[__BEGIN2]], ptr noundef nonnull align 1 dereferenceable(1) [[TMP0]])
61-
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[__RANGE2]], align 8
61+
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[__RANGE2]], align 8, !nonnull [[META2]]
6262
// CHECK-NEXT: call void @_ZN7MyRange3endEv(ptr dead_on_unwind writable sret([[STRUCT_MYITERATOR]]) align 1 [[__END2]], ptr noundef nonnull align 1 dereferenceable(1) [[TMP1]])
6363
// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_ZNK10MyIteratordeEv(ptr noundef nonnull align 1 dereferenceable(1) [[__BEGIN2]])
6464
// CHECK-NEXT: store i32 [[CALL]], ptr [[I]], align 4
@@ -75,8 +75,8 @@ extern "C" void workshareloop_rangefor(float *a, float *b, float *c) {
7575
// CHECK-NEXT: [[TMP4:%.*]] = sub i64 [[DOTCOUNT]], 1
7676
// CHECK-NEXT: store i64 [[TMP4]], ptr [[P_UPPERBOUND]], align 8
7777
// CHECK-NEXT: store i64 1, ptr [[P_STRIDE]], align 8
78-
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])
79-
// CHECK-NEXT: call void @__kmpc_for_static_init_8u(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i64 1, i64 0)
78+
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]])
79+
// CHECK-NEXT: call void @__kmpc_for_static_init_8u(ptr @[[GLOB1:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i64 1, i64 0)
8080
// CHECK-NEXT: [[TMP5:%.*]] = load i64, ptr [[P_LOWERBOUND]], align 8
8181
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr [[P_UPPERBOUND]], align 8
8282
// CHECK-NEXT: [[TMP7:%.*]] = sub i64 [[TMP6]], [[TMP5]]
@@ -113,8 +113,8 @@ extern "C" void workshareloop_rangefor(float *a, float *b, float *c) {
113113
// CHECK-NEXT: br label [[OMP_LOOP_HEADER]]
114114
// CHECK: omp_loop.exit:
115115
// CHECK-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
116-
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
117-
// CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
116+
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
117+
// CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
118118
// CHECK-NEXT: br label [[OMP_LOOP_AFTER:%.*]]
119119
// CHECK: omp_loop.after:
120120
// CHECK-NEXT: ret void
@@ -132,10 +132,10 @@ extern "C" void workshareloop_rangefor(float *a, float *b, float *c) {
132132
// CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8
133133
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8
134134
// CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON:%.*]], ptr [[TMP0]], i32 0, i32 0
135-
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8
135+
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2]]
136136
// CHECK-NEXT: call void @_ZN10MyIteratorC1ERKS_(ptr noundef nonnull align 1 dereferenceable(1) [[DOTSTART]], ptr noundef nonnull align 1 dereferenceable(1) [[TMP2]])
137137
// CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON]], ptr [[TMP0]], i32 0, i32 1
138-
// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP3]], align 8
138+
// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP3]], align 8, !nonnull [[META2]]
139139
// CHECK-NEXT: call void @_ZN10MyIteratorC1ERKS_(ptr noundef nonnull align 1 dereferenceable(1) [[DOTSTOP]], ptr noundef nonnull align 1 dereferenceable(1) [[TMP4]])
140140
// CHECK-NEXT: store i64 1, ptr [[DOTSTEP]], align 8
141141
// CHECK-NEXT: [[TMP5:%.*]] = load i64, ptr [[DOTSTEP]], align 8
@@ -156,7 +156,7 @@ extern "C" void workshareloop_rangefor(float *a, float *b, float *c) {
156156
// CHECK-NEXT: br label [[COND_END]]
157157
// CHECK: cond.end:
158158
// CHECK-NEXT: [[COND:%.*]] = phi i64 [ [[DIV]], [[COND_TRUE]] ], [ [[DIV3]], [[COND_FALSE]] ]
159-
// CHECK-NEXT: [[TMP8:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8
159+
// CHECK-NEXT: [[TMP8:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3:![0-9]+]]
160160
// CHECK-NEXT: store i64 [[COND]], ptr [[TMP8]], align 8
161161
// CHECK-NEXT: ret void
162162
//
@@ -177,7 +177,7 @@ extern "C" void workshareloop_rangefor(float *a, float *b, float *c) {
177177
// CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[MUL]] to i32
178178
// CHECK-NEXT: call void @_ZNK10MyIteratorplEj(ptr dead_on_unwind writable sret([[STRUCT_MYITERATOR]]) align 1 [[REF_TMP]], ptr noundef nonnull align 1 dereferenceable(1) [[TMP0]], i32 noundef [[CONV]])
179179
// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_ZNK10MyIteratordeEv(ptr noundef nonnull align 1 dereferenceable(1) [[REF_TMP]])
180-
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8
180+
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]], !align [[META4:![0-9]+]]
181181
// CHECK-NEXT: store i32 [[CALL]], ptr [[TMP2]], align 4
182182
// CHECK-NEXT: ret void
183183
//

clang/test/OpenMP/irbuilder_for_unsigned.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ extern "C" void workshareloop_unsigned(float *a, float *b, float *c, float *d) {
4646
// CHECK-NEXT: [[TMP3:%.*]] = sub i32 [[DOTCOUNT]], 1
4747
// CHECK-NEXT: store i32 [[TMP3]], ptr [[P_UPPERBOUND]], align 4
4848
// CHECK-NEXT: store i32 1, ptr [[P_STRIDE]], align 4
49-
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])
50-
// CHECK-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i32 1, i32 0)
49+
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]])
50+
// CHECK-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB1:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i32 1, i32 0)
5151
// CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[P_LOWERBOUND]], align 4
5252
// CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[P_UPPERBOUND]], align 4
5353
// CHECK-NEXT: [[TMP6:%.*]] = sub i32 [[TMP5]], [[TMP4]]
@@ -90,8 +90,8 @@ extern "C" void workshareloop_unsigned(float *a, float *b, float *c, float *d) {
9090
// CHECK-NEXT: br label [[OMP_LOOP_HEADER]]
9191
// CHECK: omp_loop.exit:
9292
// CHECK-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
93-
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM9:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
94-
// CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM9]])
93+
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM9:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
94+
// CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM9]])
9595
// CHECK-NEXT: br label [[OMP_LOOP_AFTER:%.*]]
9696
// CHECK: omp_loop.after:
9797
// CHECK-NEXT: ret void
@@ -109,7 +109,7 @@ extern "C" void workshareloop_unsigned(float *a, float *b, float *c, float *d) {
109109
// CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8
110110
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8
111111
// CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON:%.*]], ptr [[TMP0]], i32 0, i32 0
112-
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8
112+
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2:![0-9]+]], !align [[META3:![0-9]+]]
113113
// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
114114
// CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4
115115
// CHECK-NEXT: store i32 32000000, ptr [[DOTSTOP]], align 4
@@ -132,7 +132,7 @@ extern "C" void workshareloop_unsigned(float *a, float *b, float *c, float *d) {
132132
// CHECK-NEXT: br label [[COND_END]]
133133
// CHECK: cond.end:
134134
// CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ]
135-
// CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8
135+
// CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3]]
136136
// CHECK-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4
137137
// CHECK-NEXT: ret void
138138
//
@@ -152,7 +152,7 @@ extern "C" void workshareloop_unsigned(float *a, float *b, float *c, float *d) {
152152
// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4
153153
// CHECK-NEXT: [[MUL:%.*]] = mul i32 7, [[TMP3]]
154154
// CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]]
155-
// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8
155+
// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]], !align [[META3]]
156156
// CHECK-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4
157157
// CHECK-NEXT: ret void
158158
//

clang/test/OpenMP/irbuilder_for_unsigned_auto.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ extern "C" void workshareloop_unsigned_auto(float *a, float *b, float *c, float
5151
// CHECK-NEXT: store i32 1, ptr [[P_LOWERBOUND]], align 4
5252
// CHECK-NEXT: store i32 [[DOTCOUNT]], ptr [[P_UPPERBOUND]], align 4
5353
// CHECK-NEXT: store i32 1, ptr [[P_STRIDE]], align 4
54-
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])
55-
// CHECK-NEXT: call void @__kmpc_dispatch_init_4u(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 1073741862, i32 1, i32 [[DOTCOUNT]], i32 1, i32 1)
54+
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]])
55+
// CHECK-NEXT: call void @__kmpc_dispatch_init_4u(ptr @[[GLOB1:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 1073741862, i32 1, i32 [[DOTCOUNT]], i32 1, i32 1)
5656
// CHECK-NEXT: br label [[OMP_LOOP_PREHEADER_OUTER_COND:%.*]]
5757
// CHECK: omp_loop.header:
5858
// CHECK-NEXT: [[OMP_LOOP_IV:%.*]] = phi i32 [ [[LB:%.*]], [[OMP_LOOP_PREHEADER_OUTER_COND]] ], [ [[OMP_LOOP_NEXT:%.*]], [[OMP_LOOP_INC:%.*]] ]
@@ -90,8 +90,8 @@ extern "C" void workshareloop_unsigned_auto(float *a, float *b, float *c, float
9090
// CHECK-NEXT: [[OMP_LOOP_NEXT]] = add nuw i32 [[OMP_LOOP_IV]], 1
9191
// CHECK-NEXT: br label [[OMP_LOOP_HEADER:%.*]]
9292
// CHECK: omp_loop.exit:
93-
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM9:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
94-
// CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM9]])
93+
// CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM9:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
94+
// CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM9]])
9595
// CHECK-NEXT: br label [[OMP_LOOP_AFTER:%.*]]
9696
// CHECK: omp_loop.after:
9797
// CHECK-NEXT: ret void
@@ -115,7 +115,7 @@ extern "C" void workshareloop_unsigned_auto(float *a, float *b, float *c, float
115115
// CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8
116116
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8
117117
// CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON:%.*]], ptr [[TMP0]], i32 0, i32 0
118-
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8
118+
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2:![0-9]+]], !align [[META3:![0-9]+]]
119119
// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
120120
// CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4
121121
// CHECK-NEXT: store i32 32000000, ptr [[DOTSTOP]], align 4
@@ -138,7 +138,7 @@ extern "C" void workshareloop_unsigned_auto(float *a, float *b, float *c, float
138138
// CHECK-NEXT: br label [[COND_END]]
139139
// CHECK: cond.end:
140140
// CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ]
141-
// CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8
141+
// CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3]]
142142
// CHECK-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4
143143
// CHECK-NEXT: ret void
144144
//
@@ -158,7 +158,7 @@ extern "C" void workshareloop_unsigned_auto(float *a, float *b, float *c, float
158158
// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4
159159
// CHECK-NEXT: [[MUL:%.*]] = mul i32 7, [[TMP3]]
160160
// CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]]
161-
// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8
161+
// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]], !align [[META3]]
162162
// CHECK-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4
163163
// CHECK-NEXT: ret void
164164
//

0 commit comments

Comments
 (0)