[clang] 150e625 - [CIR][OpenMP] Add OpenMP-to-LLVM type conversion for CIR-to-LLVM lowering (#190063)

via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 15 09:13:20 PDT 2026


Author: Jan Leyonberg
Date: 2026-04-15T12:13:15-04:00
New Revision: 150e62532fd3b063f80626dbcebf0aa131a5b1c6

URL: https://github.com/llvm/llvm-project/commit/150e62532fd3b063f80626dbcebf0aa131a5b1c6
DIFF: https://github.com/llvm/llvm-project/commit/150e62532fd3b063f80626dbcebf0aa131a5b1c6.diff

LOG: [CIR][OpenMP] Add OpenMP-to-LLVM type conversion for CIR-to-LLVM lowering (#190063)

Register OpenMP conversion legality and patterns in the CIR-to-LLVM pass
so that OpenMP operations (e.g. omp.map.info, omp.target) have their CIR
types converted to LLVM types during lowering. Without this,
the conversion leaves behind unrealized_conversion_cast ops that cause
translation to LLVM IR to fail.

Also registers omp::PointerLikeType on cir::PointerType so that CIR
pointers are accepted as operands in OpenMP map operations.

Assised-by: Cursor / Claude Opus 4.6

Added: 
    clang/test/CIR/Lowering/omp-target-map.cir

Modified: 
    clang/lib/CIR/Dialect/OpenMP/RegisterOpenMPExtensions.cpp
    clang/lib/CIR/Lowering/DirectToLLVM/CMakeLists.txt
    clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/CIR/Dialect/OpenMP/RegisterOpenMPExtensions.cpp b/clang/lib/CIR/Dialect/OpenMP/RegisterOpenMPExtensions.cpp
index b5129202e66c4..3a66f93238808 100644
--- a/clang/lib/CIR/Dialect/OpenMP/RegisterOpenMPExtensions.cpp
+++ b/clang/lib/CIR/Dialect/OpenMP/RegisterOpenMPExtensions.cpp
@@ -11,8 +11,20 @@
 //===----------------------------------------------------------------------===//
 
 #include "clang/CIR/Dialect/OpenMP/RegisterOpenMPExtensions.h"
+#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
 #include "mlir/Dialect/OpenMP/OpenMPInterfaces.h"
 #include "clang/CIR/Dialect/IR/CIRDialect.h"
+#include "clang/CIR/Dialect/IR/CIRTypes.h"
+
+namespace {
+struct OpenMPPointerLikeModel
+    : public mlir::omp::PointerLikeType::ExternalModel<OpenMPPointerLikeModel,
+                                                       cir::PointerType> {
+  mlir::Type getElementType(mlir::Type pointer) const {
+    return mlir::cast<cir::PointerType>(pointer).getPointee();
+  }
+};
+} // namespace
 
 namespace cir::omp {
 
@@ -20,6 +32,7 @@ void registerOpenMPExtensions(mlir::DialectRegistry &registry) {
   registry.addExtension(+[](mlir::MLIRContext *ctx, cir::CIRDialect *dialect) {
     cir::FuncOp::attachInterface<
         mlir::omp::DeclareTargetDefaultModel<cir::FuncOp>>(*ctx);
+    cir::PointerType::attachInterface<OpenMPPointerLikeModel>(*ctx);
   });
 }
 

diff  --git a/clang/lib/CIR/Lowering/DirectToLLVM/CMakeLists.txt b/clang/lib/CIR/Lowering/DirectToLLVM/CMakeLists.txt
index e3fb928900978..8aad4999e0a2b 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/CMakeLists.txt
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/CMakeLists.txt
@@ -22,6 +22,7 @@ add_clang_library(clangCIRLoweringDirectToLLVM
   MLIRCIRTargetLowering
   MLIRBuiltinToLLVMIRTranslation
   MLIRLLVMToLLVMIRTranslation
+  MLIROpenMPToLLVM
   MLIROpenMPToLLVMIRTranslation
   MLIROpenMPTransforms
   MLIRIR

diff  --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 491858a3d6d32..79c4c48a9fde1 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -17,10 +17,12 @@
 #include <optional>
 
 #include "mlir/Conversion/LLVMCommon/TypeConverter.h"
+#include "mlir/Conversion/OpenMPToLLVM/ConvertOpenMPToLLVM.h"
 #include "mlir/Dialect/DLTI/DLTI.h"
 #include "mlir/Dialect/Func/IR/FuncOps.h"
 #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
 #include "mlir/Dialect/LLVMIR/LLVMTypes.h"
+#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
 #include "mlir/Dialect/OpenMP/Transforms/Passes.h"
 #include "mlir/Dialect/Ptr/IR/MemorySpaceInterfaces.h"
 #include "mlir/IR/BuiltinAttributes.h"
@@ -3443,6 +3445,9 @@ void ConvertCIRToLLVMPass::runOnOperation() {
   mlir::ConversionTarget target(getContext());
   target.addLegalOp<mlir::ModuleOp>();
   target.addLegalDialect<mlir::LLVM::LLVMDialect>();
+  mlir::configureOpenMPToLLVMConversionLegality(target, converter);
+  target.addLegalDialect<mlir::omp::OpenMPDialect>();
+  mlir::populateOpenMPToLLVMConversionPatterns(converter, patterns);
   target.addIllegalDialect<mlir::BuiltinDialect, cir::CIRDialect,
                            mlir::func::FuncDialect>();
 

diff  --git a/clang/test/CIR/Lowering/omp-target-map.cir b/clang/test/CIR/Lowering/omp-target-map.cir
new file mode 100644
index 0000000000000..b885cffc2bf48
--- /dev/null
+++ b/clang/test/CIR/Lowering/omp-target-map.cir
@@ -0,0 +1,30 @@
+// RUN: cir-opt %s --cir-to-llvm | FileCheck %s
+
+// Verify that OpenMP operations have their CIR types properly converted to
+// LLVM types during CIR-to-LLVM lowering. Without the OpenMP-to-LLVM
+// conversion patterns, this would fail with unrealized_conversion_cast errors.
+
+!s32i = !cir.int<s, 32>
+
+module {
+  // CHECK-LABEL: llvm.func @target_map_from
+  cir.func @target_map_from(%arg0 : !s32i) {
+    %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
+    cir.store %arg0, %0 : !s32i, !cir.ptr<!s32i>
+
+    // CHECK: %[[ALLOCA:.*]] = llvm.alloca {{.*}} x i32
+    // CHECK: %[[MAP:.*]] = omp.map.info var_ptr(%[[ALLOCA]] : !llvm.ptr, i32) map_clauses(from) capture(ByRef) -> !llvm.ptr {name = "x"}
+    %1 = omp.map.info var_ptr(%0 : !cir.ptr<!s32i>, !s32i) map_clauses(from) capture(ByRef) -> !cir.ptr<!s32i> {name = "x"}
+
+    // CHECK: omp.target map_entries(%[[MAP]] -> %[[ARG:.*]] : !llvm.ptr)
+    omp.target map_entries(%1 -> %arg1 : !cir.ptr<!s32i>) {
+      // CHECK: %[[C10:.*]] = llvm.mlir.constant(10 : i32) : i32
+      // CHECK: llvm.store %[[C10]], %[[ARG]]
+      %c10 = cir.const #cir.int<10> : !s32i
+      cir.store %c10, %arg1 : !s32i, !cir.ptr<!s32i>
+      // CHECK: omp.terminator
+      omp.terminator
+    }
+    cir.return
+  }
+}


        


More information about the cfe-commits mailing list