From 5098ddaa2f4b7a8a2331be6c5fc43f04f3aaba6c Mon Sep 17 00:00:00 2001 From: Chandra Ghale Date: Fri, 29 Aug 2025 05:39:07 -0500 Subject: [PATCH 1/3] Conditional modifier on lastprivate code is producing incorrect result in C mode --- clang/lib/CodeGen/CGExprScalar.cpp | 5 ++ clang/test/OpenMP/for_lst_private_codegen_c.c | 53 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 clang/test/OpenMP/for_lst_private_codegen_c.c diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 193710bef2d16..d37712f27ed5e 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -5183,6 +5183,11 @@ Value *ScalarExprEmitter::VisitBinAssign(const BinaryOperator *E) { CGF.EmitStoreThroughLValue(RValue::get(RHS), LHS); } } + // OpenMP: Handle lastprivate(condition:) in scalar assignment + if (CGF.getLangOpts().OpenMP) { + CGF.CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(CGF, + E->getLHS()); + } // If the result is clearly ignored, return now. if (Ignore) diff --git a/clang/test/OpenMP/for_lst_private_codegen_c.c b/clang/test/OpenMP/for_lst_private_codegen_c.c new file mode 100644 index 0000000000000..c56c5b6fb9351 --- /dev/null +++ b/clang/test/OpenMP/for_lst_private_codegen_c.c @@ -0,0 +1,53 @@ +// RUN: %clang_cc1 -verify -x c -triple x86_64-unknown-linux-gnu -fopenmp -fopenmp-version=52 -emit-llvm -o - %s | FileCheck %s +// expected-no-diagnostics + +#define N 100 +int A[N]; + +void condlastprivate() { + int x, y, z, k; + x = y = z = k = 0; + + #pragma omp parallel for lastprivate(conditional: x,y,z) lastprivate(k) + for (k = 0; k < N; k++) { + if ((k > 2) && (k < 6)) { + x = A[k]; + z = A[k] + 111; + } else { + y = A[k] + 222; + } + } +} + +int main() { + for (int i = 0; i < N; i++) + A[i] = i; + condlastprivate(); + return 0; +} + +// CHECK: @.pl_cond.x_[[ID:[0-9]+]].iv = common global i32 0, align 4 +// CHECK: @pl_cond.x_[[ID]] = common global i32 0, align 4 +// CHECK: @.gomp_critical_user_pl_cond.x_[[ID]].var = common global [8 x i32] zeroinitializer, align 8 + +// CHECK: @.pl_cond.z_[[ID]].iv = common global i32 0, align 4 +// CHECK: @pl_cond.z_[[ID]] = common global i32 0, align 4 +// CHECK: @.gomp_critical_user_pl_cond.z_[[ID]].var = common global [8 x i32] zeroinitializer, align 8 + +// CHECK: @.pl_cond.y_[[ID]].iv = common global i32 0, align 4 +// CHECK: @pl_cond.y_[[ID]] = common global i32 0, align 4 +// CHECK: @.gomp_critical_user_pl_cond.y_[[ID]].var = common global [8 x i32] zeroinitializer, align 8 + +// CHECK-LABEL: define internal void @condlastprivate.omp_outlined( +// CHECK: call void @__kmpc_critical(ptr @2, {{.*}}, ptr @.gomp_critical_user_pl_cond.x_[[ID]].var) +// CHECK: store i32 %{{[0-9]+}}, ptr @pl_cond.x_[[ID]], align 4 +// CHECK: call void @__kmpc_end_critical(ptr @2, {{.*}}, ptr @.gomp_critical_user_pl_cond.x_[[ID]].var) + +// CHECK: call void @__kmpc_critical(ptr @2, {{.*}}, ptr @.gomp_critical_user_pl_cond.z_[[ID]].var) +// CHECK: store i32 %{{[0-9]+}}, ptr @pl_cond.z_[[ID]], align 4 +// CHECK: call void @__kmpc_end_critical(ptr @2, {{.*}}, ptr @.gomp_critical_user_pl_cond.z_[[ID]].var) + +// CHECK: call void @__kmpc_critical(ptr @2, {{.*}}, ptr @.gomp_critical_user_pl_cond.y_[[ID]].var) +// CHECK: store i32 %{{[0-9]+}}, ptr @pl_cond.y_[[ID]], align 4 +// CHECK: call void @__kmpc_end_critical(ptr @2, {{.*}}, ptr @.gomp_critical_user_pl_cond.y_[[ID]].var) + From 6c604ddc78e410e2f0c6c1e3e814c245386ddb8b Mon Sep 17 00:00:00 2001 From: Chandra Ghale Date: Fri, 29 Aug 2025 06:03:10 -0500 Subject: [PATCH 2/3] code formating --- clang/lib/CodeGen/CGExprScalar.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index d37712f27ed5e..b31a0c777d126 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -5185,8 +5185,8 @@ Value *ScalarExprEmitter::VisitBinAssign(const BinaryOperator *E) { } // OpenMP: Handle lastprivate(condition:) in scalar assignment if (CGF.getLangOpts().OpenMP) { - CGF.CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(CGF, - E->getLHS()); + CGF.CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(CGF, + E->getLHS()); } // If the result is clearly ignored, return now. From 408f70c1306d4c5b59d8e506efdd9ef1f490e94a Mon Sep 17 00:00:00 2001 From: CHANDRA GHALE Date: Fri, 29 Aug 2025 16:40:05 +0530 Subject: [PATCH 3/3] formating --- clang/lib/CodeGen/CGExprScalar.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index b31a0c777d126..2d685e4a3e243 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -5185,8 +5185,8 @@ Value *ScalarExprEmitter::VisitBinAssign(const BinaryOperator *E) { } // OpenMP: Handle lastprivate(condition:) in scalar assignment if (CGF.getLangOpts().OpenMP) { - CGF.CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(CGF, - E->getLHS()); + CGF.CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(CGF, + E->getLHS()); } // If the result is clearly ignored, return now.