Skip to content

Commit 8a2c7a2

Browse files
committed
[OPENMP]Fix PR50733: unexpected final value of list-item in linear clause in loop construct.
Currently the last value of linear is calculated as var = init + num_iters * step. Replaced it with var = var_priv, i.e. original variable gets the value of the last private copy. Differential Revision: https://reviews.llvm.org/D105151
1 parent c27734c commit 8a2c7a2

9 files changed

+3010
-3575
lines changed

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18062,13 +18062,12 @@ static bool FinishOpenMPLinearClause(OMPLinearClause &Clause, DeclRefExpr *IV,
1806218062
Update = SemaRef.ActOnFinishFullExpr(Update.get(), DE->getBeginLoc(),
1806318063
/*DiscardedValue*/ false);
1806418064

18065-
// Build final: Var = InitExpr + NumIterations * Step
18065+
// Build final: Var = PrivCopy;
1806618066
ExprResult Final;
1806718067
if (!Info.first)
18068-
Final =
18069-
buildCounterUpdate(SemaRef, S, RefExpr->getExprLoc(), CapturedRef,
18070-
InitExpr, NumIterations, Step, /*Subtract=*/false,
18071-
/*IsNonRectangularLB=*/false);
18068+
Final = SemaRef.BuildBinOp(
18069+
S, RefExpr->getExprLoc(), BO_Assign, CapturedRef,
18070+
SemaRef.DefaultLvalueConversion(*CurPrivate).get());
1807218071
else
1807318072
Final = *CurPrivate;
1807418073
Final = SemaRef.ActOnFinishFullExpr(Final.get(), DE->getBeginLoc(),

clang/test/OpenMP/for_linear_codegen.cpp

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

clang/test/OpenMP/for_simd_codegen.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,8 @@ void simple(float *a, float *b, float *c, float *d) {
115115
// CHECK: [[SIMPLE_LOOP2_END]]:
116116
//
117117
// Update linear vars after loop, as the loop was operating on a private version.
118-
// CHECK: [[LIN0_2:%.+]] = load i64, i64* [[LIN0]]
119-
// CHECK-NEXT: [[LIN_ADD2:%.+]] = add nsw i64 [[LIN0_2]], 27
120-
// CHECK-NEXT: store i64 [[LIN_ADD2]], i64* [[K_VAR]]
118+
// CHECK: [[LIN0_2:%.+]] = load i64, i64* [[K_PRIVATIZED]]
119+
// CHECK-NEXT: store i64 [[LIN0_2]], i64* [[K_VAR]]
121120
// CHECK: call void @__kmpc_barrier(%struct.ident_t* {{.+}}, i32 %{{.+}})
122121

123122
int lin = 12;
@@ -165,6 +164,7 @@ void simple(float *a, float *b, float *c, float *d) {
165164
// CHECK: [[LINSTART:.+]] = load i32, i32* [[LIN_START]]
166165
// CHECK: [[LINSTEP:.+]] = load i64, i64* [[LIN_STEP]]
167166
// CHECK-NOT: store i32 {{.+}}, i32* [[LIN_VAR]],
167+
// CHECK: store i32 {{.+}}, i32* [[LIN_PRIV:%[^,]+]],
168168
// CHECK: [[GLINSTART:.+]] = load double*, double** [[GLIN_START]]
169169
// CHECK-NEXT: [[IV3_1:%.+]] = load i64, i64* [[OMP_IV3]]
170170
// CHECK-NEXT: [[MUL:%.+]] = mul i64 [[IV3_1]], 1
@@ -184,11 +184,10 @@ void simple(float *a, float *b, float *c, float *d) {
184184
// CHECK: call void @__kmpc_for_static_fini(%struct.ident_t* {{.+}}, i32 %{{.+}})
185185
//
186186
// Linear start and step are used to calculate final value of the linear variables.
187-
// CHECK: [[LINSTART:.+]] = load i32, i32* [[LIN_START]]
188-
// CHECK: [[LINSTEP:.+]] = load i64, i64* [[LIN_STEP]]
189-
// CHECK: store i32 {{.+}}, i32* [[LIN_VAR]],
190-
// CHECK: [[GLINSTART:.+]] = load double*, double** [[GLIN_START]]
191-
// CHECK: store double* {{.*}}[[GLIN_VAR]]
187+
// CHECK: [[LIN:%.+]] = load i32, i32* [[LIN_PRIV]],
188+
// CHECK-NEXT: store i32 [[LIN]], i32* [[LIN_VAR]],
189+
// CHECK: [[GLIN:%.+]] = load double*, double** [[G_PTR_CUR]],
190+
// CHECK-NEXT: store double* [[GLIN]], double** [[GLIN_VAR]],
192191
// CHECK: call void @__kmpc_barrier(%struct.ident_t* {{.+}}, i32 %{{.+}})
193192

194193
#pragma omp for simd

clang/test/OpenMP/parallel_for_linear_codegen.cpp

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,10 @@ int main() {
210210
// CHECK1-NEXT: [[TMP20:%.*]] = icmp ne i32 [[TMP19]], 0
211211
// CHECK1-NEXT: br i1 [[TMP20]], label [[DOTOMP_LINEAR_PU:%.*]], label [[DOTOMP_LINEAR_PU_DONE:%.*]]
212212
// CHECK1: .omp.linear.pu:
213-
// CHECK1-NEXT: [[TMP21:%.*]] = load float*, float** [[DOTLINEAR_START]], align 8
214-
// CHECK1-NEXT: [[ADD_PTR11:%.*]] = getelementptr inbounds float, float* [[TMP21]], i64 6
215-
// CHECK1-NEXT: store float* [[ADD_PTR11]], float** [[TMP0]], align 8
216-
// CHECK1-NEXT: [[TMP22:%.*]] = load i64, i64* [[DOTLINEAR_START1]], align 8
217-
// CHECK1-NEXT: [[ADD12:%.*]] = add nsw i64 [[TMP22]], 6
218-
// CHECK1-NEXT: store i64 [[ADD12]], i64* [[TMP1]], align 8
213+
// CHECK1-NEXT: [[TMP21:%.*]] = load float*, float** [[PVAR2]], align 8
214+
// CHECK1-NEXT: store float* [[TMP21]], float** [[TMP0]], align 8
215+
// CHECK1-NEXT: [[TMP22:%.*]] = load i64, i64* [[LVAR3]], align 8
216+
// CHECK1-NEXT: store i64 [[TMP22]], i64* [[TMP1]], align 8
219217
// CHECK1-NEXT: br label [[DOTOMP_LINEAR_PU_DONE]]
220218
// CHECK1: .omp.linear.pu.done:
221219
// CHECK1-NEXT: ret void
@@ -360,12 +358,10 @@ int main() {
360358
// CHECK1-NEXT: [[TMP20:%.*]] = icmp ne i32 [[TMP19]], 0
361359
// CHECK1-NEXT: br i1 [[TMP20]], label [[DOTOMP_LINEAR_PU:%.*]], label [[DOTOMP_LINEAR_PU_DONE:%.*]]
362360
// CHECK1: .omp.linear.pu:
363-
// CHECK1-NEXT: [[TMP21:%.*]] = load i32*, i32** [[DOTLINEAR_START]], align 8
364-
// CHECK1-NEXT: [[ADD_PTR9:%.*]] = getelementptr inbounds i32, i32* [[TMP21]], i64 2
365-
// CHECK1-NEXT: store i32* [[ADD_PTR9]], i32** [[TMP0]], align 8
366-
// CHECK1-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTLINEAR_START1]], align 4
367-
// CHECK1-NEXT: [[ADD10:%.*]] = add nsw i32 [[TMP22]], 2
368-
// CHECK1-NEXT: store i32 [[ADD10]], i32* [[TMP1]], align 4
361+
// CHECK1-NEXT: [[TMP21:%.*]] = load i32*, i32** [[PVAR2]], align 8
362+
// CHECK1-NEXT: store i32* [[TMP21]], i32** [[TMP0]], align 8
363+
// CHECK1-NEXT: [[TMP22:%.*]] = load i32, i32* [[LVAR3]], align 4
364+
// CHECK1-NEXT: store i32 [[TMP22]], i32* [[TMP1]], align 4
369365
// CHECK1-NEXT: br label [[DOTOMP_LINEAR_PU_DONE]]
370366
// CHECK1: .omp.linear.pu.done:
371367
// CHECK1-NEXT: ret void
@@ -534,12 +530,10 @@ int main() {
534530
// CHECK2-NEXT: [[TMP20:%.*]] = icmp ne i32 [[TMP19]], 0
535531
// CHECK2-NEXT: br i1 [[TMP20]], label [[DOTOMP_LINEAR_PU:%.*]], label [[DOTOMP_LINEAR_PU_DONE:%.*]]
536532
// CHECK2: .omp.linear.pu:
537-
// CHECK2-NEXT: [[TMP21:%.*]] = load float*, float** [[DOTLINEAR_START]], align 8
538-
// CHECK2-NEXT: [[ADD_PTR11:%.*]] = getelementptr inbounds float, float* [[TMP21]], i64 6
539-
// CHECK2-NEXT: store float* [[ADD_PTR11]], float** [[TMP0]], align 8
540-
// CHECK2-NEXT: [[TMP22:%.*]] = load i64, i64* [[DOTLINEAR_START1]], align 8
541-
// CHECK2-NEXT: [[ADD12:%.*]] = add nsw i64 [[TMP22]], 6
542-
// CHECK2-NEXT: store i64 [[ADD12]], i64* [[TMP1]], align 8
533+
// CHECK2-NEXT: [[TMP21:%.*]] = load float*, float** [[PVAR2]], align 8
534+
// CHECK2-NEXT: store float* [[TMP21]], float** [[TMP0]], align 8
535+
// CHECK2-NEXT: [[TMP22:%.*]] = load i64, i64* [[LVAR3]], align 8
536+
// CHECK2-NEXT: store i64 [[TMP22]], i64* [[TMP1]], align 8
543537
// CHECK2-NEXT: br label [[DOTOMP_LINEAR_PU_DONE]]
544538
// CHECK2: .omp.linear.pu.done:
545539
// CHECK2-NEXT: ret void
@@ -684,12 +678,10 @@ int main() {
684678
// CHECK2-NEXT: [[TMP20:%.*]] = icmp ne i32 [[TMP19]], 0
685679
// CHECK2-NEXT: br i1 [[TMP20]], label [[DOTOMP_LINEAR_PU:%.*]], label [[DOTOMP_LINEAR_PU_DONE:%.*]]
686680
// CHECK2: .omp.linear.pu:
687-
// CHECK2-NEXT: [[TMP21:%.*]] = load i32*, i32** [[DOTLINEAR_START]], align 8
688-
// CHECK2-NEXT: [[ADD_PTR9:%.*]] = getelementptr inbounds i32, i32* [[TMP21]], i64 2
689-
// CHECK2-NEXT: store i32* [[ADD_PTR9]], i32** [[TMP0]], align 8
690-
// CHECK2-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTLINEAR_START1]], align 4
691-
// CHECK2-NEXT: [[ADD10:%.*]] = add nsw i32 [[TMP22]], 2
692-
// CHECK2-NEXT: store i32 [[ADD10]], i32* [[TMP1]], align 4
681+
// CHECK2-NEXT: [[TMP21:%.*]] = load i32*, i32** [[PVAR2]], align 8
682+
// CHECK2-NEXT: store i32* [[TMP21]], i32** [[TMP0]], align 8
683+
// CHECK2-NEXT: [[TMP22:%.*]] = load i32, i32* [[LVAR3]], align 4
684+
// CHECK2-NEXT: store i32 [[TMP22]], i32* [[TMP1]], align 4
693685
// CHECK2-NEXT: br label [[DOTOMP_LINEAR_PU_DONE]]
694686
// CHECK2: .omp.linear.pu.done:
695687
// CHECK2-NEXT: ret void
@@ -825,9 +817,8 @@ int main() {
825817
// CHECK3-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0
826818
// CHECK3-NEXT: br i1 [[TMP16]], label [[DOTOMP_LINEAR_PU:%.*]], label [[DOTOMP_LINEAR_PU_DONE:%.*]]
827819
// CHECK3: .omp.linear.pu:
828-
// CHECK3-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTLINEAR_START]], align 4
829-
// CHECK3-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP17]], 10
830-
// CHECK3-NEXT: store i32 [[ADD7]], i32* [[TMP0]], align 4
820+
// CHECK3-NEXT: [[TMP17:%.*]] = load i32, i32* [[G1]], align 4
821+
// CHECK3-NEXT: store i32 [[TMP17]], i32* [[TMP0]], align 4
831822
// CHECK3-NEXT: br label [[DOTOMP_LINEAR_PU_DONE]]
832823
// CHECK3: .omp.linear.pu.done:
833824
// CHECK3-NEXT: ret void
@@ -955,9 +946,8 @@ int main() {
955946
// CHECK4-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0
956947
// CHECK4-NEXT: br i1 [[TMP21]], label [[DOTOMP_LINEAR_PU:%.*]], label [[DOTOMP_LINEAR_PU_DONE:%.*]]
957948
// CHECK4: .omp.linear.pu:
958-
// CHECK4-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTLINEAR_START]], align 4
959-
// CHECK4-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP22]], 10
960-
// CHECK4-NEXT: store i32 [[ADD7]], i32* [[TMP0]], align 4
949+
// CHECK4-NEXT: [[TMP22:%.*]] = load i32, i32* [[G1]], align 4
950+
// CHECK4-NEXT: store i32 [[TMP22]], i32* [[TMP0]], align 4
961951
// CHECK4-NEXT: br label [[DOTOMP_LINEAR_PU_DONE]]
962952
// CHECK4: .omp.linear.pu.done:
963953
// CHECK4-NEXT: ret void
@@ -975,4 +965,3 @@ int main() {
975965
// CHECK4-NEXT: store i32 2, i32* [[BLOCK_CAPTURE_ADDR]], align 8
976966
// CHECK4-NEXT: ret void
977967
//
978-
//

clang/test/OpenMP/parallel_for_simd_codegen.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,8 @@ void simple(float *a, float *b, float *c, float *d) {
123123
// CHECK: [[SIMPLE_LOOP2_END]]:
124124
//
125125
// Update linear vars after loop, as the loop was operating on a private version.
126-
// CHECK: [[LIN0_2:%.+]] = load i64, i64* [[LIN0]]
127-
// CHECK-NEXT: [[LIN_ADD2:%.+]] = add nsw i64 [[LIN0_2]], 27
128-
// CHECK-NEXT: store i64 [[LIN_ADD2]], i64* %{{.+}}
126+
// CHECK: [[LIN0_2:%.+]] = load i64, i64* [[K_PRIVATIZED]]
127+
// CHECK-NEXT: store i64 [[LIN0_2]], i64* %{{.+}}
129128

130129
int lin = 12;
131130
#pragma omp parallel for simd linear(lin : get_val()), linear(g_ptr)
@@ -173,6 +172,7 @@ void simple(float *a, float *b, float *c, float *d) {
173172
// CHECK: [[LINSTART:.+]] = load i32, i32* [[LIN_START]]
174173
// CHECK: [[LINSTEP:.+]] = load i64, i64* [[LIN_STEP]]
175174
// CHECK-NOT: store i32 {{.+}}, i32* [[LIN_VAR]]
175+
// CHECK: store i32 {{.+}}, i32* [[LIN_PRIV:%[^,]+]],
176176
// CHECK: [[GLINSTART:.+]] = load double*, double** [[GLIN_START]]
177177
// CHECK-NEXT: [[IV3_1:%.+]] = load i64, i64* [[OMP_IV3]]
178178
// CHECK-NEXT: [[MUL:%.+]] = mul i64 [[IV3_1]], 1
@@ -192,11 +192,10 @@ void simple(float *a, float *b, float *c, float *d) {
192192
// CHECK: call void @__kmpc_for_static_fini(%struct.ident_t* {{.+}}, i32 %{{.+}})
193193
//
194194
// Linear start and step are used to calculate final value of the linear variables.
195-
// CHECK: [[LINSTART:.+]] = load i32, i32* [[LIN_START]]
196-
// CHECK: [[LINSTEP:.+]] = load i64, i64* [[LIN_STEP]]
197-
// CHECK: store i32 {{.+}}, i32* [[LIN_VAR]],
198-
// CHECK: [[GLINSTART:.+]] = load double*, double** [[GLIN_START]]
199-
// CHECK: store double* {{.*}}[[GLIN_VAR]]
195+
// CHECK: [[LIN:%.+]] = load i32, i32* [[LIN_PRIV]]
196+
// CHECK: store i32 [[LIN]], i32* [[LIN_VAR]],
197+
// CHECK: [[GLIN:%.+]] = load double*, double** [[G_PTR_CUR]]
198+
// CHECK: store double* [[GLIN]], double** [[GLIN_VAR]],
200199

201200
#pragma omp parallel for simd
202201
// CHECK: call void @__kmpc_for_static_init_4(%struct.ident_t* {{[^,]+}}, i32 %{{[^,]+}}, i32 34, i32* %{{[^,]+}}, i32* [[LB:%[^,]+]], i32* [[UB:%[^,]+]], i32* [[STRIDE:%[^,]+]], i32 1, i32 1)

clang/test/OpenMP/parallel_master_taskloop_simd_lastprivate_codegen.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2681,9 +2681,8 @@ void loop() {
26812681
// CHECK6-NEXT: [[TMP38:%.*]] = icmp ne i32 [[TMP37]], 0
26822682
// CHECK6-NEXT: br i1 [[TMP38]], label [[DOTOMP_LINEAR_PU_I:%.*]], label [[DOTOMP_OUTLINED__1_EXIT:%.*]]
26832683
// CHECK6: .omp.linear.pu.i:
2684-
// CHECK6-NEXT: [[TMP39:%.*]] = load i32, i32* [[DOTLINEAR_START1_I]], align 4, !noalias !14
2685-
// CHECK6-NEXT: [[ADD7_I:%.*]] = add nsw i32 [[TMP39]], 10
2686-
// CHECK6-NEXT: store i32 [[ADD7_I]], i32* [[J_I]], align 4, !noalias !14
2684+
// CHECK6-NEXT: [[TMP39:%.*]] = load i32, i32* [[J_I]], align 4, !noalias !14
2685+
// CHECK6-NEXT: store i32 [[TMP39]], i32* [[J_I]], align 4, !noalias !14
26872686
// CHECK6-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT]]
26882687
// CHECK6: .omp_outlined..1.exit:
26892688
// CHECK6-NEXT: ret i32 0
@@ -3701,8 +3700,7 @@ void loop() {
37013700
// CHECK12-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]]
37023701
// CHECK12: omp.inner.for.end:
37033702
// CHECK12-NEXT: store i32 10, i32* [[I]], align 4
3704-
// CHECK12-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTLINEAR_START1]], align 4
3705-
// CHECK12-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP10]], 10
3706-
// CHECK12-NEXT: store i32 [[ADD9]], i32* [[J]], align 4
3703+
// CHECK12-NEXT: [[TMP10:%.*]] = load i32, i32* [[J4]], align 4
3704+
// CHECK12-NEXT: store i32 [[TMP10]], i32* [[J]], align 4
37073705
// CHECK12-NEXT: ret void
37083706
//

clang/test/OpenMP/simd_codegen.cpp

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,8 @@ void simple(float *a, float *b, float *c, float *d) {
111111
// CHECK: [[SIMPLE_LOOP2_END]]:
112112
//
113113
// Update linear vars after loop, as the loop was operating on a private version.
114-
// CHECK: [[LIN0_2:%.+]] = load i64, i64* [[LIN0]]
115-
// CHECK-NEXT: [[LIN_ADD2:%.+]] = add nsw i64 [[LIN0_2]], 27
116-
// CHECK-NEXT: store i64 [[LIN_ADD2]], i64* [[K_VAR]]
114+
// CHECK: [[LIN0_2:%.+]] = load i64, i64* [[K_PRIVATIZED]],
115+
// CHECK-NEXT: store i64 [[LIN0_2]], i64* [[K_VAR]]
117116
//
118117

119118
int lin = 12;
@@ -147,6 +146,7 @@ void simple(float *a, float *b, float *c, float *d) {
147146
// CHECK: [[LINSTART:.+]] = load i32, i32* [[LIN_START]]{{.*}}!llvm.access.group
148147
// CHECK: [[LINSTEP:.+]] = load i64, i64* [[LIN_STEP]]{{.*}}!llvm.access.group
149148
// CHECK-NOT: store i32 {{.+}}, i32* [[LIN_VAR]],{{.*}}!llvm.access.group
149+
// CHECK: store i32 {{.+}}, i32* [[LIN_PRIV:%.+]],{{.*}}!llvm.access.group
150150
// CHECK: [[GLINSTART:.+]] = load double*, double** [[GLIN_START]]{{.*}}!llvm.access.group
151151
// CHECK-NEXT: [[IV3_1:%.+]] = load i64, i64* [[OMP_IV3]]{{.*}}!llvm.access.group
152152
// CHECK-NEXT: [[MUL:%.+]] = mul i64 [[IV3_1]], 1
@@ -165,11 +165,10 @@ void simple(float *a, float *b, float *c, float *d) {
165165
// CHECK: [[SIMPLE_LOOP3_END]]:
166166
//
167167
// Linear start and step are used to calculate final value of the linear variables.
168-
// CHECK: [[LINSTART:.+]] = load i32, i32* [[LIN_START]]
169-
// CHECK: [[LINSTEP:.+]] = load i64, i64* [[LIN_STEP]]
170-
// CHECK: store i32 {{.+}}, i32* [[LIN_VAR]],
171-
// CHECK: [[GLINSTART:.+]] = load double*, double** [[GLIN_START]]
172-
// CHECK: store double* {{.*}}[[GLIN_VAR]]
168+
// CHECK: [[LIN:%.+]] = load i32, i32* [[LIN_PRIV]]
169+
// CHECK-NEXT: store i32 [[LIN]], i32* [[LIN_VAR]],
170+
// CHECK: [[GLIN:%.+]] = load double*, double** [[G_PTR_CUR]]
171+
// CHECK-NEXT: store double* [[GLIN]], double** [[GLIN_VAR]]
173172

174173
#pragma omp simd
175174
// CHECK: store i32 0, i32* [[OMP_IV4:%[^,]+]]
@@ -666,10 +665,9 @@ void linear(float *a) {
666665
// Update linear vars after loop, as the loop was operating on a private version.
667666
// CHECK: [[K_REF:%.+]] = load i64*, i64** [[K_ADDR_REF]],
668667
// CHECK: store i64* [[K_REF]], i64** [[K_PRIV_REF:%.+]],
669-
// CHECK: [[LIN0_2:%.+]] = load i64, i64* [[LIN0]]
670-
// CHECK-NEXT: [[LIN_ADD2:%.+]] = add nsw i64 [[LIN0_2]], 27
668+
// CHECK: [[LIN0_2:%.+]] = load i64, i64* [[K_PRIVATIZED]]
671669
// CHECK-NEXT: [[K_REF:%.+]] = load i64*, i64** [[K_PRIV_REF]],
672-
// CHECK-NEXT: store i64 [[LIN_ADD2]], i64* [[K_REF]]
670+
// CHECK-NEXT: store i64 [[LIN0_2]], i64* [[K_REF]]
673671
//
674672

675673
#pragma omp simd linear(val(k) : 3)
@@ -711,10 +709,9 @@ void linear(float *a) {
711709
// Update linear vars after loop, as the loop was operating on a private version.
712710
// CHECK: [[K_REF:%.+]] = load i64*, i64** [[K_ADDR_REF]],
713711
// CHECK: store i64* [[K_REF]], i64** [[K_PRIV_REF:%.+]],
714-
// CHECK: [[LIN0_2:%.+]] = load i64, i64* [[LIN0]]
715-
// CHECK-NEXT: [[LIN_ADD2:%.+]] = add nsw i64 [[LIN0_2]], 27
712+
// CHECK: [[LIN0_2:%.+]] = load i64, i64* [[K_PRIVATIZED]]
716713
// CHECK-NEXT: [[K_REF:%.+]] = load i64*, i64** [[K_PRIV_REF]],
717-
// CHECK-NEXT: store i64 [[LIN_ADD2]], i64* [[K_REF]]
714+
// CHECK-NEXT: store i64 [[LIN0_2]], i64* [[K_REF]]
718715
//
719716
#pragma omp simd linear(uval(k) : 3)
720717
// CHECK: store i32 0, i32* [[OMP_IV:%[^,]+]]
@@ -750,9 +747,8 @@ void linear(float *a) {
750747
// CHECK: [[SIMPLE_LOOP_END]]:
751748
//
752749
// Update linear vars after loop, as the loop was operating on a private version.
753-
// CHECK: [[LIN0_2:%.+]] = load i64, i64* [[LIN0]]
754-
// CHECK-NEXT: [[LIN_ADD2:%.+]] = add nsw i64 [[LIN0_2]], 27
755-
// CHECK-NEXT: store i64 [[LIN_ADD2]], i64* [[VAL_ADDR]]
750+
// CHECK: [[LIN0_2:%.+]] = load i64, i64* [[K_PRIVATIZED]]
751+
// CHECK-NEXT: store i64 [[LIN0_2]], i64* [[VAL_ADDR]]
756752
//
757753
}
758754

0 commit comments

Comments
 (0)