https://github.com/joker-eph updated 
https://github.com/llvm/llvm-project/pull/232766

>From b060acfd4a71fb33356c8759675760870c7c6af3 Mon Sep 17 00:00:00 2001
From: Mehdi Amini <[email protected]>
Date: Fri, 16 Oct 2026 07:16:50 -0700
Subject: [PATCH 1/2] [mlir][CIR] Separate OpenMP LLVM conversion helpers from
 the pass

Move the standalone OpenMP-to-LLVM pass to its own translation unit.
Keep MLIROpenMPToLLVM as the complete public conversion target, and
provide patterns, legality, and dialect-interface registration through
MLIROpenMPToLLVMConversion.

Use the helper target in CIR lowering and Flang code generation, and
remove the unused conversion dependency from FIRDialect. This breaks the
CIR link path through MemRef conversion and utilities to Affine without
splitting MemRef utilities or moving IR-dependent constraint analysis.

Validated static and shared CMake consumers and all 12 OpenMP-to-LLVM
and MemRef-to-LLVM regression files. The CIR suite has 1,255 passes and
one baseline-reproduced failure with identical LLVM IR. Missing-
dependency diagnostics are unchanged from baseline.

Assisted-by: Codex
---
 .../CIR/Lowering/DirectToLLVM/CMakeLists.txt  |  2 +-
 flang/lib/Optimizer/CodeGen/CMakeLists.txt    |  2 +-
 flang/lib/Optimizer/Dialect/CMakeLists.txt    |  1 -
 .../OpenMPToLLVM/ConvertOpenMPToLLVM.h        |  2 +
 .../Conversion/OpenMPToLLVM/CMakeLists.txt    | 38 ++++++++++++-
 .../Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp  | 41 -------------
 .../OpenMPToLLVM/OpenMPToLLVMPass.cpp         | 57 +++++++++++++++++++
 7 files changed, 97 insertions(+), 46 deletions(-)
 create mode 100644 mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVMPass.cpp

diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/CMakeLists.txt 
b/clang/lib/CIR/Lowering/DirectToLLVM/CMakeLists.txt
index 009d437da0f166..4b9186e5fedba8 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/CMakeLists.txt
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/CMakeLists.txt
@@ -27,7 +27,7 @@ add_clang_library(clangCIRLoweringDirectToLLVM
   MLIRLLVMDialect
   MLIRLLVMToLLVMIRTranslation
   MLIROpenMPDialect
-  MLIROpenMPToLLVM
+  MLIROpenMPToLLVMConversion
   MLIROpenMPToLLVMIRTranslation
   MLIROpenMPTransforms
   MLIRIR
diff --git a/flang/lib/Optimizer/CodeGen/CMakeLists.txt 
b/flang/lib/Optimizer/CodeGen/CMakeLists.txt
index 69e1bfc4b8081b..c3cb3ca4b3ebfd 100644
--- a/flang/lib/Optimizer/CodeGen/CMakeLists.txt
+++ b/flang/lib/Optimizer/CodeGen/CMakeLists.txt
@@ -44,7 +44,7 @@ add_flang_library(FIRCodeGen
   MLIRMathToLibm
   MLIRMathToNVVM
   MLIRMathToROCDL
-  MLIROpenMPToLLVM
+  MLIROpenMPToLLVMConversion
   MLIROpenACCDialect
   MLIRBuiltinToLLVMIRTranslation
   MLIRLLVMToLLVMIRTranslation
diff --git a/flang/lib/Optimizer/Dialect/CMakeLists.txt 
b/flang/lib/Optimizer/Dialect/CMakeLists.txt
index 08fd679c74c91c..e2a67a586752ba 100644
--- a/flang/lib/Optimizer/Dialect/CMakeLists.txt
+++ b/flang/lib/Optimizer/Dialect/CMakeLists.txt
@@ -43,7 +43,6 @@ add_flang_library(FIRDialect
   MLIROpenACCDialect
   MLIROpenACCUtils
   MLIRBuiltinToLLVMIRTranslation
-  MLIROpenMPToLLVM
   MLIRLLVMToLLVMIRTranslation
   MLIRTargetLLVMIRExport
 )
diff --git a/mlir/include/mlir/Conversion/OpenMPToLLVM/ConvertOpenMPToLLVM.h 
b/mlir/include/mlir/Conversion/OpenMPToLLVM/ConvertOpenMPToLLVM.h
index 4822d6836ded11..1b1003e83bf565 100644
--- a/mlir/include/mlir/Conversion/OpenMPToLLVM/ConvertOpenMPToLLVM.h
+++ b/mlir/include/mlir/Conversion/OpenMPToLLVM/ConvertOpenMPToLLVM.h
@@ -18,6 +18,8 @@ class MLIRContext;
 class Pass;
 class RewritePatternSet;
 
+// MLIROpenMPToLLVMConversion provides the conversion helpers and dialect
+// interface below. MLIROpenMPToLLVM also provides the standalone pass.
 #define GEN_PASS_DECL_CONVERTOPENMPTOLLVMPASS
 #include "mlir/Conversion/Passes.h.inc"
 
diff --git a/mlir/lib/Conversion/OpenMPToLLVM/CMakeLists.txt 
b/mlir/lib/Conversion/OpenMPToLLVM/CMakeLists.txt
index c5f84aa95e64fb..1e2ce9efd62924 100644
--- a/mlir/lib/Conversion/OpenMPToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/OpenMPToLLVM/CMakeLists.txt
@@ -1,9 +1,40 @@
-add_mlir_conversion_library(MLIROpenMPToLLVM
+set(LLVM_OPTIONAL_SOURCES
+  OpenMPToLLVM.cpp
+  OpenMPToLLVMPass.cpp
+  )
+
+# Reusable OpenMP patterns, conversion legality, and dialect interface. Clients
+# with their own lowering pipeline do not need the standalone pass's 
conversions
+# for other dialects.
+add_mlir_conversion_library(MLIROpenMPToLLVMConversion
   OpenMPToLLVM.cpp
 
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/OpenMPToLLVM
 
+  DEPENDS
+  MLIRConversionPassIncGen
+  MLIRConvertToLLVMInterfaceIncGen
+  intrinsics_gen
+
+  LINK_COMPONENTS
+  Core
+
+  LINK_LIBS PUBLIC
+  MLIRIR
+  MLIRLLVMCommonConversion
+  MLIRLLVMDialect
+  MLIROpenMPDialect
+  )
+
+# Keep the existing target as the complete conversion library, including the
+# standalone pass and all APIs provided by MLIROpenMPToLLVMConversion.
+add_mlir_conversion_library(MLIROpenMPToLLVM
+  OpenMPToLLVMPass.cpp
+
+  ADDITIONAL_HEADER_DIRS
+  ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/OpenMPToLLVM
+
   DEPENDS
   MLIRConversionPassIncGen
   intrinsics_gen
@@ -13,11 +44,14 @@ add_mlir_conversion_library(MLIROpenMPToLLVM
 
   LINK_LIBS PUBLIC
   MLIRArithToLLVM
+  MLIRControlFlowToLLVM
   MLIRFuncToLLVM
   MLIRIR
   MLIRLLVMCommonConversion
   MLIRLLVMDialect
   MLIRMemRefToLLVM
   MLIROpenMPDialect
-  MLIRTransforms
+  MLIROpenMPToLLVMConversion
+  MLIRPass
+  MLIRTransformUtils
   )
diff --git a/mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp 
b/mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp
index cf1bd76eda6a16..5a185adde149d8 100644
--- a/mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp
+++ b/mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp
@@ -8,21 +8,10 @@
 
 #include "mlir/Conversion/OpenMPToLLVM/ConvertOpenMPToLLVM.h"
 
-#include "mlir/Conversion/ArithToLLVM/ArithToLLVM.h"
-#include "mlir/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.h"
 #include "mlir/Conversion/ConvertToLLVM/ToLLVMInterface.h"
-#include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVM.h"
-#include "mlir/Conversion/LLVMCommon/ConversionTarget.h"
 #include "mlir/Conversion/LLVMCommon/Pattern.h"
-#include "mlir/Conversion/MemRefToLLVM/MemRefToLLVM.h"
 #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
 #include "mlir/Dialect/OpenMP/OpenMPDialect.h"
-#include "mlir/Pass/Pass.h"
-
-namespace mlir {
-#define GEN_PASS_DEF_CONVERTOPENMPTOLLVMPASS
-#include "mlir/Conversion/Passes.h.inc"
-} // namespace mlir
 
 using namespace mlir;
 
@@ -194,36 +183,6 @@ void 
mlir::populateOpenMPToLLVMConversionPatterns(LLVMTypeConverter &converter,
       >(converter, patterns);
 }
 
-namespace {
-struct ConvertOpenMPToLLVMPass
-    : public impl::ConvertOpenMPToLLVMPassBase<ConvertOpenMPToLLVMPass> {
-  using Base::Base;
-
-  void runOnOperation() override;
-};
-} // namespace
-
-void ConvertOpenMPToLLVMPass::runOnOperation() {
-  auto module = getOperation();
-
-  // Convert to OpenMP operations with LLVM IR dialect
-  RewritePatternSet patterns(&getContext());
-  LLVMTypeConverter converter(&getContext());
-  arith::populateArithToLLVMConversionPatterns(converter, patterns);
-  cf::populateControlFlowToLLVMConversionPatterns(converter, patterns);
-  cf::populateAssertToLLVMConversionPattern(converter, patterns);
-  populateFinalizeMemRefToLLVMConversionPatterns(converter, patterns);
-  populateFuncToLLVMConversionPatterns(converter, patterns);
-  populateOpenMPToLLVMConversionPatterns(converter, patterns);
-
-  LLVMConversionTarget target(getContext());
-  target.addLegalOp<omp::BarrierOp, omp::FlushOp, omp::TaskwaitOp,
-                    omp::TaskyieldOp, omp::TerminatorOp>();
-  configureOpenMPToLLVMConversionLegality(target, converter);
-  if (failed(applyPartialConversion(module, target, std::move(patterns))))
-    signalPassFailure();
-}
-
 
//===----------------------------------------------------------------------===//
 // ConvertToLLVMPatternInterface implementation
 
//===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVMPass.cpp 
b/mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVMPass.cpp
new file mode 100644
index 00000000000000..8743f7c0586253
--- /dev/null
+++ b/mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVMPass.cpp
@@ -0,0 +1,57 @@
+//===- OpenMPToLLVMPass.cpp - OpenMP to LLVM pass ------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir/Conversion/OpenMPToLLVM/ConvertOpenMPToLLVM.h"
+
+#include "mlir/Conversion/ArithToLLVM/ArithToLLVM.h"
+#include "mlir/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.h"
+#include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVM.h"
+#include "mlir/Conversion/LLVMCommon/ConversionTarget.h"
+#include "mlir/Conversion/LLVMCommon/TypeConverter.h"
+#include "mlir/Conversion/MemRefToLLVM/MemRefToLLVM.h"
+#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
+#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
+#include "mlir/Pass/Pass.h"
+#include "mlir/Transforms/DialectConversion.h"
+
+namespace mlir {
+#define GEN_PASS_DEF_CONVERTOPENMPTOLLVMPASS
+#include "mlir/Conversion/Passes.h.inc"
+} // namespace mlir
+
+using namespace mlir;
+
+namespace {
+struct ConvertOpenMPToLLVMPass
+    : public impl::ConvertOpenMPToLLVMPassBase<ConvertOpenMPToLLVMPass> {
+  using Base::Base;
+
+  void runOnOperation() override;
+};
+} // namespace
+
+void ConvertOpenMPToLLVMPass::runOnOperation() {
+  auto module = getOperation();
+
+  // Convert to OpenMP operations with LLVM IR dialect
+  RewritePatternSet patterns(&getContext());
+  LLVMTypeConverter converter(&getContext());
+  arith::populateArithToLLVMConversionPatterns(converter, patterns);
+  cf::populateControlFlowToLLVMConversionPatterns(converter, patterns);
+  cf::populateAssertToLLVMConversionPattern(converter, patterns);
+  populateFinalizeMemRefToLLVMConversionPatterns(converter, patterns);
+  populateFuncToLLVMConversionPatterns(converter, patterns);
+  populateOpenMPToLLVMConversionPatterns(converter, patterns);
+
+  LLVMConversionTarget target(getContext());
+  target.addLegalOp<omp::BarrierOp, omp::FlushOp, omp::TaskwaitOp,
+                    omp::TaskyieldOp, omp::TerminatorOp>();
+  configureOpenMPToLLVMConversionLegality(target, converter);
+  if (failed(applyPartialConversion(module, target, std::move(patterns))))
+    signalPassFailure();
+}

>From 78673fb159b5727ea199391a693a9ebdff7c308d Mon Sep 17 00:00:00 2001
From: Mehdi Amini <[email protected]>
Date: Fri, 16 Oct 2026 08:08:38 -0700
Subject: [PATCH 2/2] [CIR][OpenMP] Update outlined capture parameter
 expectations

Account for the capture lifetime attributes added by #218453 in both
CIR and traditional Clang code generation. The stale checks fail on the
base revision as well as the OpenMP conversion library split.

Validated the full CIR suite and the OpenMPToLLVM and MemRefToLLVM
conversion tests: 1,268 passed, 56 unsupported, one expected failure.

Assisted-by: Codex
---
 clang/test/CIR/CodeGenOpenMP/omp-llvmir.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/test/CIR/CodeGenOpenMP/omp-llvmir.c 
b/clang/test/CIR/CodeGenOpenMP/omp-llvmir.c
index 98f4caf8539935..383c3b483a5051 100644
--- a/clang/test/CIR/CodeGenOpenMP/omp-llvmir.c
+++ b/clang/test/CIR/CodeGenOpenMP/omp-llvmir.c
@@ -58,7 +58,7 @@
 // LLVM: %[[LOAD:.*]] = load i32, ptr %[[RETVAL]], align 4
 // LLVM: ret i32 %[[LOAD]]
 
-// LLVM-LABEL: define internal void @main..omp_par(ptr noalias %{{.*}}, ptr 
noalias %{{.*}}, ptr %{{.*}})
+// LLVM-LABEL: define internal void @main..omp_par(ptr noalias %{{.*}}, ptr 
noalias %{{.*}}, ptr noalias nofreeobj %{{.*}})
 // LLVM: [[PAR_ENTRY:.*]]:
 // LLVM: %[[GEP_J:.*]] = getelementptr { ptr }, ptr %{{.*}}, i32 0, i32 0
 // LLVM: %[[LOAD_J:.*]] = load ptr, ptr %[[GEP_J]], align 8
@@ -123,7 +123,7 @@
 // OGCG: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @1, i32 1, ptr 
@main.omp_outlined, ptr %[[J]])
 // OGCG: ret i32 0
 
-// OGCG-LABEL: define internal void @main.omp_outlined(ptr noalias noundef 
%{{.*}}, ptr noalias noundef %{{.*}}, ptr noundef nonnull align 4 
dereferenceable(4) %{{.*}})
+// OGCG-LABEL: define internal void @main.omp_outlined(ptr noalias noundef 
%{{.*}}, ptr noalias noundef %{{.*}}, ptr nofreeobj noundef nonnull align 4 
dereferenceable(4) %{{.*}})
 // OGCG: [[OUTLINED_ENTRY:.*]]:
 // OGCG: %[[GLOBAL_TID_ADDR:.*]] = alloca ptr, align 8
 // OGCG: %[[BOUND_TID_ADDR:.*]] = alloca ptr, align 8

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

Reply via email to