https://github.com/pedropiin updated 
https://github.com/llvm/llvm-project/pull/202466

>From 01c1b77e3f5c636789b37bf013115751bb5ac293 Mon Sep 17 00:00:00 2001
From: pedropiin <[email protected]>
Date: Mon, 8 Jun 2026 20:53:51 -0300
Subject: [PATCH] [CIR][OpenMP] Implement lowering for the 'num_threads' clause
 for 'parallel' directive

---
 clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp  | 24 +++++++++++++++++++
 .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp |  4 ++++
 clang/test/CIR/CodeGenOpenMP/parallel.c       | 15 ++++++++++++
 3 files changed, 43 insertions(+)

diff --git a/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp 
b/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp
index a0f0ea9299c8d..216bb867159f1 100644
--- a/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp
@@ -66,6 +66,30 @@ class OpenMPClauseCIREmitter final
     }
   }
 
+  void VisitOMPNumThreadsClause(const OMPNumThreadsClause *clause) {
+    if constexpr (std::is_same_v<OpTy, mlir::omp::ParallelOp>) {
+      Expr *numThreadsExpr = clause->getNumThreads();
+      mlir::Value numThreadsValue = cgf.emitScalarExpr(numThreadsExpr);
+      mlir::Location numThreadsLoc =
+          cgf.cgm.getLoc(numThreadsExpr->getBeginLoc());
+
+      cir::IntType cirIntType =
+          mlir::cast<cir::IntType>(numThreadsValue.getType());
+      mlir::Type stdIntType = builder.getIntegerType(cirIntType.getWidth());
+
+      mlir::Value unrealizedCastNumThreads =
+          mlir::UnrealizedConversionCastOp::create(builder, numThreadsLoc,
+                                                   stdIntType, numThreadsValue)
+              .getResult(0);
+
+      operation.getNumThreadsVarsMutable().append(unrealizedCastNumThreads);
+    } else {
+      cgf.cgm.errorNYI(
+          clause->getBeginLoc(),
+          "OMPNumThreadsClause unimplemented on this directive kind");
+    }
+  }
+
   void emitClauses(ArrayRef<const OMPClause *> clauses) {
     for (const auto *c : clauses)
       this->Visit(c);
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp 
b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index c4e98e299dfc1..631bae0915629 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -17,6 +17,7 @@
 
 #include "mlir/Conversion/LLVMCommon/TypeConverter.h"
 #include "mlir/Conversion/OpenMPToLLVM/ConvertOpenMPToLLVM.h"
+#include "mlir/Conversion/ReconcileUnrealizedCasts/ReconcileUnrealizedCasts.h"
 #include "mlir/Dialect/DLTI/DLTI.h"
 #include "mlir/Dialect/Func/IR/FuncOps.h"
 #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
@@ -3733,6 +3734,8 @@ void ConvertCIRToLLVMPass::runOnOperation() {
   target.addIllegalDialect<mlir::BuiltinDialect, cir::CIRDialect,
                            mlir::func::FuncDialect>();
 
+  target.addLegalOp<mlir::UnrealizedConversionCastOp>();
+
   llvm::SmallVector<mlir::Operation *> ops;
   ops.push_back(module);
   cir::collectUnreachable(module, ops);
@@ -5022,6 +5025,7 @@ void populateCIRToLLVMPasses(mlir::OpPassManager &pm) {
   mlir::populateCIRPreLoweringPasses(pm);
   pm.addPass(mlir::omp::createMarkDeclareTargetPass());
   pm.addPass(createConvertCIRToLLVMPass());
+  pm.addPass(mlir::createReconcileUnrealizedCastsPass());
 }
 
 std::unique_ptr<llvm::Module>
diff --git a/clang/test/CIR/CodeGenOpenMP/parallel.c 
b/clang/test/CIR/CodeGenOpenMP/parallel.c
index d04784879540a..e579cd9b6019e 100644
--- a/clang/test/CIR/CodeGenOpenMP/parallel.c
+++ b/clang/test/CIR/CodeGenOpenMP/parallel.c
@@ -84,3 +84,18 @@ void proc_bind_parallel() {
   // CHECK-NEXT: omp.terminator
   // CHECK-NEXT: }
 }
+
+void num_threads_parallel() {
+  // CHECK: omp.parallel num_threads(%{{.*}}: i32) {
+  #pragma omp parallel num_threads(16)
+  {}
+  // CHECK-NEXT: omp.terminator
+  // CHECK-NEXT: }
+
+int numThreads = 4;
+  // CHECK: omp.parallel num_threads(%{{.*}}: i32) {
+#pragma omp parallel num_threads(numThreads) 
+  {}
+  // CHECK-NEXT: omp.terminator
+  // CHECK-NEXT: }
+}

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to