https://github.com/koparasy updated 
https://github.com/llvm/llvm-project/pull/219078

>From d03a93a74a265f5c525f5a7cfeb1c965a2bcf427 Mon Sep 17 00:00:00 2001
From: Konstantinos Parasyris <[email protected]>
Date: Wed, 26 Aug 2026 17:17:09 -0700
Subject: [PATCH 1/3] [CIR] Source LoweringPrepare target facts from the module

---
 .../CIR/Dialect/Transforms/LoweringPrepare.cpp | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp 
b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
index f4ea1350324930..c21a9fb7a181bc 100644
--- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
@@ -7,6 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "PassDetail.h"
+#include "TargetLowering/LowerModule.h"
 #include "mlir/IR/Attributes.h"
 #include "mlir/IR/BuiltinAttributeInterfaces.h"
 #include "mlir/IR/IRMapping.h"
@@ -248,7 +249,7 @@ struct LoweringPreparePass
     } else if (useARMGuardVarABI()) {
       // Guard variables are size width on ARM (32-bit AArch32, 64-bit 
AArch64).
       const unsigned sizeTypeSize =
-          astCtx->getTypeSize(astCtx->getSignedSizeType());
+          getTargetInfo().getTypeWidth(getTargetInfo().getSignedSizeType());
       guardTy =
           cir::IntType::get(&getContext(), sizeTypeSize, /*isSigned=*/true);
       guardAlignment =
@@ -276,7 +277,7 @@ struct LoweringPreparePass
       // for non-ELF and non-Wasm object formats, so only do it for ELF and
       // Wasm.
       bool hasComdat = globalOp.getComdat();
-      const llvm::Triple &triple = astCtx->getTargetInfo().getTriple();
+      const llvm::Triple &triple = getTargetInfo().getTriple();
       // TODO(cir): for now, we're just setting comdat to true, but it should
       // contain a comdat reference name here instead.
       if (!isLocalVarDecl && hasComdat &&
@@ -298,6 +299,14 @@ struct LoweringPreparePass
 
   clang::ASTContext *astCtx;
 
+  /// Target/ABI facts sourced from the module's own attributes.
+  std::unique_ptr<cir::LowerModule> lowerModule;
+
+  const clang::TargetInfo &getTargetInfo() const {
+    assert(lowerModule && "LoweringPrepare requires a module with a triple");
+    return lowerModule->getTarget();
+  }
+
   /// Tracks current module.
   mlir::ModuleOp mlirModule;
 
@@ -388,7 +397,7 @@ struct LoweringPreparePass
 
     llvm::StringLiteral nameAtExit = "__cxa_atexit";
     if (tls)
-      nameAtExit = astCtx->getTargetInfo().getTriple().isOSDarwin()
+      nameAtExit = getTargetInfo().getTriple().isOSDarwin()
                        ? llvm::StringLiteral("_tlv_atexit")
                        : llvm::StringLiteral("__cxa_thread_atexit");
 
@@ -3029,6 +3038,9 @@ void LoweringPreparePass::runOnOperation() {
   if (isa<::mlir::ModuleOp>(op))
     mlirModule = cast<::mlir::ModuleOp>(op);
 
+  if (mlirModule)
+    lowerModule = cir::createLowerModule(mlirModule);
+
   llvm::SmallVector<mlir::Operation *> opsToTransform;
 
   op->walk([&](mlir::Operation *op) {

>From f1ba4211b07a3e56739929dd238f0089092196b2 Mon Sep 17 00:00:00 2001
From: Konstantinos Parasyris <[email protected]>
Date: Fri, 11 Sep 2026 08:00:33 -0700
Subject: [PATCH 2/3] Fix comments

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
---
 clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp 
b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
index c21a9fb7a181bc..2c4bd2f4ca3a8b 100644
--- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
@@ -3035,11 +3035,12 @@ void 
LoweringPreparePass::buildCUDARegisterVars(cir::CIRBaseBuilderTy &builder,
 
 void LoweringPreparePass::runOnOperation() {
   mlir::Operation *op = getOperation();
-  if (isa<::mlir::ModuleOp>(op))
-    mlirModule = cast<::mlir::ModuleOp>(op);
+  assert(isa<::mlir::ModuleOp>(op) && "expected a ModuleOp");
+  mlirModule = cast<::mlir::ModuleOp>(op);
 
-  if (mlirModule)
-    lowerModule = cir::createLowerModule(mlirModule);
+  // CIRGen always sets the triple, so this cannot fail.
+  lowerModule = cir::createLowerModule(mlirModule);
+  assert(lowerModule && "requires a module with a triple");
 
   llvm::SmallVector<mlir::Operation *> opsToTransform;
 

>From 2d247806086a286593e3a8c5b9c6c45a159edf7c Mon Sep 17 00:00:00 2001
From: Konstantinos Parasyris <[email protected]>
Date: Wed, 16 Sep 2026 10:28:31 -0700
Subject: [PATCH 3/3] Make LoweringPrepare a module pass

---
 clang/include/clang/CIR/Dialect/Passes.td            | 2 +-
 clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp | 6 ++----
 2 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/clang/include/clang/CIR/Dialect/Passes.td 
b/clang/include/clang/CIR/Dialect/Passes.td
index b983cfe59112a2..6994aa8a4b18ad 100644
--- a/clang/include/clang/CIR/Dialect/Passes.td
+++ b/clang/include/clang/CIR/Dialect/Passes.td
@@ -173,7 +173,7 @@ def CIREHABILowering : Pass<"cir-eh-abi-lowering", 
"mlir::ModuleOp"> {
   let dependentDialects = ["cir::CIRDialect"];
 }
 
-def LoweringPrepare : Pass<"cir-lowering-prepare"> {
+def LoweringPrepare : Pass<"cir-lowering-prepare", "mlir::ModuleOp"> {
   let summary = "Lower to more fine-grained CIR operations before lowering to "
     "other dialects";
   let description = [{
diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp 
b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
index 2c4bd2f4ca3a8b..b5e00eb331903a 100644
--- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
@@ -3034,9 +3034,7 @@ void 
LoweringPreparePass::buildCUDARegisterVars(cir::CIRBaseBuilderTy &builder,
 }
 
 void LoweringPreparePass::runOnOperation() {
-  mlir::Operation *op = getOperation();
-  assert(isa<::mlir::ModuleOp>(op) && "expected a ModuleOp");
-  mlirModule = cast<::mlir::ModuleOp>(op);
+  mlirModule = getOperation();
 
   // CIRGen always sets the triple, so this cannot fail.
   lowerModule = cir::createLowerModule(mlirModule);
@@ -3044,7 +3042,7 @@ void LoweringPreparePass::runOnOperation() {
 
   llvm::SmallVector<mlir::Operation *> opsToTransform;
 
-  op->walk([&](mlir::Operation *op) {
+  mlirModule->walk([&](mlir::Operation *op) {
     if (mlir::isa<cir::ArrayCtor, cir::ArrayDtor, cir::CastOp,
                   cir::ComplexConjOp, cir::ComplexMulOp, cir::ComplexDivOp,
                   cir::DynamicCastOp, cir::FuncOp, cir::CallOp,

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

Reply via email to