Skip to content

Commit a9fca98

Browse files
committed
[OPENMP]PR47606: Do not update the lastprivate item if it was captured by reference as firstprivate data member.
No need to make final copy from the firsptrivate/lastprivate copy to the original item if the item is a data memeber. Firstprivate copy creates a copy by reference and the original item gets updated correctly when updating the lastprivate shared variable. Differential Revision: https://reviews.llvm.org/D88179
1 parent bd44558 commit a9fca98

File tree

2 files changed

+20
-19
lines changed

2 files changed

+20
-19
lines changed

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14413,7 +14413,7 @@ OMPClause *Sema::ActOnOpenMPLastprivateClause(
1441314413
if (!isOpenMPCapturedDecl(D))
1441414414
ExprCaptures.push_back(Ref->getDecl());
1441514415
}
14416-
if (TopDVar.CKind == OMPC_firstprivate ||
14416+
if ((TopDVar.CKind == OMPC_firstprivate && !TopDVar.PrivateCopy) ||
1441714417
(!isOpenMPCapturedDecl(D) &&
1441814418
Ref->getDecl()->hasAttr<OMPCaptureNoInitAttr>())) {
1441914419
ExprResult RefRes = DefaultLvalueConversion(Ref);

clang/test/OpenMP/for_lastprivate_codegen.cpp

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,12 @@ enum omp_allocator_handle_t {
4545

4646
struct SS {
4747
int a;
48+
char e[4];
4849
int b : 4;
4950
int &c;
5051
SS(int &d) : a(0), b(0), c(d) {
5152
#pragma omp parallel
52-
#pragma omp for lastprivate(a, b, c)
53+
#pragma omp for firstprivate(e) lastprivate(a, b, c, e)
5354
for (int i = 0; i < 2; ++i)
5455
#ifdef LAMBDA
5556
[&]() {
@@ -167,9 +168,9 @@ volatile int &g1 = g;
167168
float f;
168169
char cnt;
169170

170-
// CHECK: [[SS_TY:%.+]] = type { i{{[0-9]+}}, i8
171-
// LAMBDA: [[SS_TY:%.+]] = type { i{{[0-9]+}}, i8
172-
// BLOCKS: [[SS_TY:%.+]] = type { i{{[0-9]+}}, i8
171+
// CHECK: [[SS_TY:%.+]] = type { i{{[0-9]+}}, [4 x i8], i8
172+
// LAMBDA: [[SS_TY:%.+]] = type { i{{[0-9]+}}, [4 x i8], i8
173+
// BLOCKS: [[SS_TY:%.+]] = type { i{{[0-9]+}}, [4 x i8], i8
173174
// CHECK: [[S_FLOAT_TY:%.+]] = type { float }
174175
// CHECK: [[S_INT_TY:%.+]] = type { i32 }
175176
// CHECK-DAG: [[IMPLICIT_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 66, i32 0, i32 0, i8*
@@ -225,9 +226,9 @@ int main() {
225226
// LAMBDA: define {{.+}} @{{.+}}([[SS_TY]]*
226227
// LAMBDA: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 0
227228
// LAMBDA: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
228-
// LAMBDA: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 1
229-
// LAMBDA: store i8
230229
// LAMBDA: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 2
230+
// LAMBDA: store i8
231+
// LAMBDA: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 3
231232
// LAMBDA: call void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, [[SS_TY]]*)* [[SS_MICROTASK:@.+]] to void
232233
// LAMBDA: call void @__kmpc_for_static_init_4(
233234
// LAMBDA-NOT: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 0
@@ -237,14 +238,14 @@ int main() {
237238

238239
// LAMBDA: define internal void [[SS_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
239240
// LAMBDA: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 0
240-
// LAMBDA-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 1
241-
// LAMBDA: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 2
241+
// LAMBDA-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 2
242+
// LAMBDA: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 3
242243
// LAMBDA: call void @__kmpc_for_static_init_4(
243244
// LAMBDA-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]*
244245
// LAMBDA: call{{.*}} void [[SS_LAMBDA:@[^ ]+]]
245246
// LAMBDA: call void @__kmpc_for_static_fini(
246247
// LAMBDA: br i1
247-
// LAMBDA: [[B_REF:%.+]] = getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 1
248+
// LAMBDA: [[B_REF:%.+]] = getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 2
248249
// LAMBDA: store i8 %{{.+}}, i8* [[B_REF]],
249250
// LAMBDA: br label
250251
// LAMBDA: ret void
@@ -420,9 +421,9 @@ int main() {
420421
// BLOCKS: define {{.+}} @{{.+}}([[SS_TY]]*
421422
// BLOCKS: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 0
422423
// BLOCKS: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
423-
// BLOCKS: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 1
424-
// BLOCKS: store i8
425424
// BLOCKS: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 2
425+
// BLOCKS: store i8
426+
// BLOCKS: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 3
426427
// BLOCKS: call void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, [[SS_TY]]*)* [[SS_MICROTASK:@.+]] to void
427428
// BLOCKS: call void @__kmpc_for_static_init_4(
428429
// BLOCKS-NOT: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 0
@@ -432,14 +433,14 @@ int main() {
432433

433434
// BLOCKS: define internal void [[SS_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
434435
// BLOCKS: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 0
435-
// BLOCKS-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 1
436-
// BLOCKS: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 2
436+
// BLOCKS-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 2
437+
// BLOCKS: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 3
437438
// BLOCKS: call void @__kmpc_for_static_init_4(
438439
// BLOCKS-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]*
439440
// BLOCKS: call{{.*}} void
440441
// BLOCKS: call void @__kmpc_for_static_fini(
441442
// BLOCKS: br i1
442-
// BLOCKS: [[B_REF:%.+]] = getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 1
443+
// BLOCKS: [[B_REF:%.+]] = getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 2
443444
// BLOCKS: store i8 %{{.+}}, i8* [[B_REF]],
444445
// BLOCKS: br label
445446
// BLOCKS: ret void
@@ -724,14 +725,14 @@ int main() {
724725
// CHECK: define {{.+}} @{{.+}}([[SS_TY]]*
725726
// CHECK: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 0
726727
// CHECK: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
727-
// CHECK: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 1
728-
// CHECK: store i8
729728
// CHECK: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 2
729+
// CHECK: store i8
730+
// CHECK: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 3
730731
// CHECK: call void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, [[SS_TY]]*)* [[SS_MICROTASK:@.+]] to void
731732
// CHECK: call void @__kmpc_for_static_init_4(
732733
// CHECK-NOT: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 0
733-
// CHECK: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 1
734734
// CHECK: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 2
735+
// CHECK: getelementptr inbounds [[SS_TY]], [[SS_TY]]* %{{.+}}, i32 0, i32 3
735736
// CHECK: call void @__kmpc_for_static_fini(%
736737
// CHECK: ret
737738

@@ -762,7 +763,7 @@ int main() {
762763
// CHECK-NEXT: store i{{[0-9]+}} [[DIV]], i{{[0-9]+}}* [[C_PRIV]],
763764
// CHECK: call void @__kmpc_for_static_fini(
764765
// CHECK: br i1
765-
// CHECK: [[B_REF:%.+]] = getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 1
766+
// CHECK: [[B_REF:%.+]] = getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %{{.*}}, i32 0, i32 2
766767
// CHECK: store i8 %{{.+}}, i8* [[B_REF]],
767768
// CHECK: br label
768769
// CHECK: ret void

0 commit comments

Comments
 (0)