[clang] [OpenMP] Conditional modifier on lastprivate clause is producing incorrect result in C mode (PR #156004)

CHANDRA GHALE via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 29 04:10:13 PDT 2025


https://github.com/chandraghale updated https://github.com/llvm/llvm-project/pull/156004

>From 5098ddaa2f4b7a8a2331be6c5fc43f04f3aaba6c Mon Sep 17 00:00:00 2001
From: Chandra Ghale <ghale at pe31.hpc.amslabs.hpecorp.net>
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 <ghale at pe31.hpc.amslabs.hpecorp.net>
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 <chandra.nitdgp at gmail.com>
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.



More information about the cfe-commits mailing list