[clang] [CIR] Make ASTContext optional in runCIRToCIRPasses (PR #227128)
Konstantinos Parasyris via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 30 16:54:46 PDT 2026
https://github.com/koparasy updated https://github.com/llvm/llvm-project/pull/227128
>From f237142d3fbae586ff891b8b56b4d1dd0a4f077f Mon Sep 17 00:00:00 2001
From: Konstantinos Parasyris <konstantinos.parasyris at intel.com>
Date: Mon, 28 Sep 2026 14:35:01 -0700
Subject: [PATCH 1/4] [CIR] Make runCIRToCIRPasses independent of ASTContext
Read the triple and the new cir.target_abi attribute from the module instead of the ASTContext, erroring if either is missing, so the CIR-to-CIR pipeline can run without a live AST.
Co-Authored-By: Claude Opus 5.5 <noreply at anthropic.com>
---
clang/include/clang/CIR/CIRToCIRPasses.h | 11 ++---
.../clang/CIR/Dialect/IR/CIRDialect.td | 2 +
clang/include/clang/CIR/Dialect/Passes.h | 6 ---
clang/lib/CIR/CodeGen/CIRGenModule.cpp | 2 +
.../Dialect/Transforms/LoweringPrepare.cpp | 16 -------
clang/lib/CIR/FrontendAction/CIRGenAction.cpp | 2 +-
clang/lib/CIR/Lowering/CIRPasses.cpp | 43 +++++++++++--------
.../CodeGen/call-conv-lowering-x86_64-avx.c | 6 +++
8 files changed, 40 insertions(+), 48 deletions(-)
diff --git a/clang/include/clang/CIR/CIRToCIRPasses.h b/clang/include/clang/CIR/CIRToCIRPasses.h
index 6e60614f8e9de..e4d2eff5baded 100644
--- a/clang/include/clang/CIR/CIRToCIRPasses.h
+++ b/clang/include/clang/CIR/CIRToCIRPasses.h
@@ -17,10 +17,6 @@
#include <memory>
-namespace clang {
-class ASTContext;
-}
-
namespace mlir {
class MLIRContext;
class ModuleOp;
@@ -31,10 +27,9 @@ namespace cir {
// Run set of cleanup/prepare/etc passes CIR <-> CIR.
mlir::LogicalResult
runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext &mlirCtx,
- clang::ASTContext &astCtx, bool enableVerifier,
- bool enableIdiomRecognizer, bool enableCIRSimplify,
- bool enableLibOpt, llvm::StringRef libOptOptions,
- bool enableCallConvLowering);
+ bool enableVerifier, bool enableIdiomRecognizer,
+ bool enableCIRSimplify, bool enableLibOpt,
+ llvm::StringRef libOptOptions, bool enableCallConvLowering);
} // namespace cir
diff --git a/clang/include/clang/CIR/Dialect/IR/CIRDialect.td b/clang/include/clang/CIR/Dialect/IR/CIRDialect.td
index da487139dc9e9..d4ec063d8db0f 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIRDialect.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIRDialect.td
@@ -41,6 +41,8 @@ def CIR_Dialect : Dialect {
let extraClassDeclaration = [{
static llvm::StringRef getSourceLanguageAttrName() { return "cir.lang"; }
static llvm::StringRef getTripleAttrName() { return "cir.triple"; }
+ // TargetInfo::getABI(), e.g. "avx512" on x86 or "aapcs" on ARM.
+ static llvm::StringRef getTargetABIAttrName() { return "cir.target_abi"; }
static llvm::StringRef getSizeTypeWidthAttrName() { return "cir.size_type_width"; }
static llvm::StringRef getIntTypeWidthAttrName() { return "cir.int_type_width"; }
static llvm::StringRef getOptInfoAttrName() { return "cir.opt_info"; }
diff --git a/clang/include/clang/CIR/Dialect/Passes.h b/clang/include/clang/CIR/Dialect/Passes.h
index 42dd338306456..dedfc9fa35179 100644
--- a/clang/include/clang/CIR/Dialect/Passes.h
+++ b/clang/include/clang/CIR/Dialect/Passes.h
@@ -23,10 +23,6 @@ namespace cir {
enum class CallConvTarget { None, Test, X86_64 };
} // namespace cir
-namespace clang {
-class ASTContext;
-}
-
namespace mlir {
std::unique_ptr<Pass> createCIRCanonicalizePass();
@@ -43,11 +39,9 @@ createCallConvLoweringPass(cir::CallConvTarget target,
const llvm::abi::X86ABICompatInfo &x86AbiCompat);
std::unique_ptr<Pass> createHoistAllocasPass();
std::unique_ptr<Pass> createLoweringPreparePass();
-std::unique_ptr<Pass> createLoweringPreparePass(clang::ASTContext *astCtx);
std::unique_ptr<Pass> createGotoSolverPass();
std::unique_ptr<Pass> createIdiomRecognizerPass();
std::unique_ptr<Pass> createLibOptPass();
-std::unique_ptr<Pass> createLibOptPass(clang::ASTContext *astCtx);
void populateCIRPreLoweringPasses(mlir::OpPassManager &pm);
diff --git a/clang/lib/CIR/CodeGen/CIRGenModule.cpp b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
index c45d6d6ca48fa..cf83635a2e5ed 100644
--- a/clang/lib/CIR/CodeGen/CIRGenModule.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
@@ -148,6 +148,8 @@ CIRGenModule::CIRGenModule(mlir::MLIRContext &mlirContext,
}
theModule->setAttr(cir::CIRDialect::getTripleAttrName(),
builder.getStringAttr(getTriple().str()));
+ theModule->setAttr(cir::CIRDialect::getTargetABIAttrName(),
+ builder.getStringAttr(getTarget().getABI()));
if (llvm::VersionTuple sdkVersion = getTarget().getSDKVersion();
!sdkVersion.empty())
theModule->setAttr(cir::CIRDialect::getSDKVersionAttrName(),
diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
index 9a3c9c9745eaa..41f253e7147e0 100644
--- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
@@ -13,7 +13,6 @@
#include "mlir/IR/IRMapping.h"
#include "mlir/IR/Location.h"
#include "mlir/IR/Value.h"
-#include "clang/AST/ASTContext.h"
#include "clang/Basic/Cuda.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/Specifiers.h"
@@ -290,12 +289,6 @@ struct LoweringPreparePass
return guard;
}
- ///
- /// AST related
- /// -----------
-
- clang::ASTContext *astCtx = nullptr;
-
/// Target/ABI facts sourced from the module's own attributes.
std::unique_ptr<cir::LowerModule> lowerModule;
@@ -578,8 +571,6 @@ struct LoweringPreparePass
builder.createYield(loc); // Outermost IfOp
}
-
- void setASTContext(clang::ASTContext *c) { astCtx = c; }
};
} // namespace
@@ -3111,10 +3102,3 @@ void LoweringPreparePass::runOnOperation() {
std::unique_ptr<Pass> mlir::createLoweringPreparePass() {
return std::make_unique<LoweringPreparePass>();
}
-
-std::unique_ptr<Pass>
-mlir::createLoweringPreparePass(clang::ASTContext *astCtx) {
- auto pass = std::make_unique<LoweringPreparePass>();
- pass->setASTContext(astCtx);
- return std::move(pass);
-}
diff --git a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp
index 94aea278b4fa9..47ad71e689378 100644
--- a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp
+++ b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp
@@ -165,7 +165,7 @@ class CIRGenConsumer : public clang::ASTConsumer {
const bool EnableLibOpt =
FEOptions.ClangIRLibOptEnabled && (CGO.OptimizationLevel > 0);
if (runCIRToCIRPasses(
- MlirModule, MlirCtx, C, !FEOptions.ClangIRDisableCIRVerifier,
+ MlirModule, MlirCtx, !FEOptions.ClangIRDisableCIRVerifier,
FEOptions.ClangIREnableIdiomRecognizer, CGO.OptimizationLevel > 0,
EnableLibOpt, LibOptOptions, FEOptions.ClangIRCallConvLowering)
.failed()) {
diff --git a/clang/lib/CIR/Lowering/CIRPasses.cpp b/clang/lib/CIR/Lowering/CIRPasses.cpp
index b612b64b71476..6e75ce03d14ff 100644
--- a/clang/lib/CIR/Lowering/CIRPasses.cpp
+++ b/clang/lib/CIR/Lowering/CIRPasses.cpp
@@ -12,9 +12,7 @@
#include "mlir/IR/BuiltinOps.h"
#include "mlir/Pass/PassManager.h"
-#include "clang/AST/ASTContext.h"
#include "clang/Basic/LangOptions.h"
-#include "clang/Basic/TargetInfo.h"
#include "clang/CIR/Dialect/IR/CIRDialect.h"
#include "clang/CIR/Dialect/Passes.h"
#include "llvm/Support/TimeProfiler.h"
@@ -44,10 +42,9 @@ static llvm::abi::X86AVXABILevel getX86AVXABILevel(llvm::StringRef abi) {
/// Whether `__attribute__((target(...)))` on a function may raise its AVX ABI
/// level above the command line's. A target that opts out, and any ABI older
/// than the rule, stay at the module level.
-static bool allowsX86TargetAttrAvx(const clang::ASTContext &astContext,
+static bool allowsX86TargetAttrAvx(const llvm::Triple &triple,
clang::LangOptions::ClangABI compat) {
- return !astContext.getTargetInfo().getTriple().isPS() &&
- compat > clang::LangOptions::ClangABI::Ver23;
+ return !triple.isPS() && compat > clang::LangOptions::ClangABI::Ver23;
}
/// The x86_64 ABI-compatibility flags, derived from the target and the
@@ -56,9 +53,8 @@ static bool allowsX86TargetAttrAvx(const clang::ASTContext &astContext,
/// modern Linux target, so leaving it at the default classifies a union larger
/// than an eightbyte as though every member spanned its size.
static llvm::abi::X86ABICompatInfo
-getX86ABICompatInfo(const clang::ASTContext &astContext,
+getX86ABICompatInfo(const llvm::Triple &triple,
clang::LangOptions::ClangABI compat) {
- const llvm::Triple &triple = astContext.getTargetInfo().getTriple();
llvm::abi::X86ABICompatInfo abiCompat;
abiCompat.HonorsRevision98 = !triple.isOSDarwin();
abiCompat.ClassifyIntegerMMXAsSSE =
@@ -76,13 +72,27 @@ getX86ABICompatInfo(const clang::ASTContext &astContext,
mlir::LogicalResult
runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext &mlirContext,
- clang::ASTContext &astContext, bool enableVerifier,
- bool enableIdiomRecognizer, bool enableCIRSimplify,
- bool enableLibOpt, llvm::StringRef libOptOptions,
- bool enableCallConvLowering) {
+ bool enableVerifier, bool enableIdiomRecognizer,
+ bool enableCIRSimplify, bool enableLibOpt,
+ llvm::StringRef libOptOptions, bool enableCallConvLowering) {
llvm::TimeTraceScope scope("CIR To CIR Passes");
+ auto tripleAttr = theModule->getAttrOfType<mlir::StringAttr>(
+ cir::CIRDialect::getTripleAttrName());
+ if (!tripleAttr)
+ return theModule.emitError()
+ << "missing '" << cir::CIRDialect::getTripleAttrName()
+ << "' attribute";
+ llvm::Triple triple(tripleAttr.getValue());
+
+ auto abiAttr = theModule->getAttrOfType<mlir::StringAttr>(
+ cir::CIRDialect::getTargetABIAttrName());
+ if (!abiAttr)
+ return theModule.emitError()
+ << "missing '" << cir::CIRDialect::getTargetABIAttrName()
+ << "' attribute";
+
mlir::PassManager pm(&mlirContext);
pm.addPass(mlir::createCIRCanonicalizePass());
@@ -111,15 +121,14 @@ runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext &mlirContext,
// outlines dynamic global initializers into functions. It must run before
// CallConvLowering so the classifier sees them, otherwise their signatures
// go unclassified and caller and callee disagree on the ABI.
- pm.addPass(mlir::createLoweringPreparePass(&astContext));
+ pm.addPass(mlir::createLoweringPreparePass());
if (enableCallConvLowering) {
// CallConvLowering rewrites signatures and call sites using the classifier,
// so it must run after CXXABILowering has lowered C++ ABI types to plain
// records the classifier can handle. Only the x86_64 System V classifier
// is implemented; other targets are left unchanged.
- const clang::TargetInfo &targetInfo = astContext.getTargetInfo();
- CallConvTarget target = getCallConvTarget(targetInfo.getTriple());
+ CallConvTarget target = getCallConvTarget(triple);
if (target != CallConvTarget::None) {
// Source the ABI-compatibility version from the module's serialized
// #cir.lowering_lang_options so a reloaded .cir classifies the same way
@@ -133,9 +142,9 @@ runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext &mlirContext,
compat = static_cast<clang::LangOptions::ClangABI>(
loweringLangOpts.getClangAbiCompat());
pm.addPass(mlir::createCallConvLoweringPass(
- target, getX86AVXABILevel(targetInfo.getABI()),
- allowsX86TargetAttrAvx(astContext, compat),
- getX86ABICompatInfo(astContext, compat)));
+ target, getX86AVXABILevel(abiAttr.getValue()),
+ allowsX86TargetAttrAvx(triple, compat),
+ getX86ABICompatInfo(triple, compat)));
}
}
diff --git a/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-avx.c b/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-avx.c
index 95dad6a68f615..bd9537a4296e5 100644
--- a/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-avx.c
+++ b/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-avx.c
@@ -12,6 +12,8 @@
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -target-feature +avx -emit-llvm %s -o %t-avx.ll
// RUN: FileCheck --check-prefixes=LLVM,LLVM-AVX,LLVM-OGCG-AVX --input-file=%t-avx.ll %s
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -target-feature +avx512f -fclangir -emit-cir %s -o %t-avx512.cir
+// RUN: FileCheck --check-prefix=CIR-AVX512 --input-file=%t-avx512.cir %s
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -target-feature +avx512f -fclangir -emit-llvm %s -o %t-avx512-cir.ll
// RUN: FileCheck --check-prefixes=LLVM,LLVM-AVX512 --input-file=%t-avx512-cir.ll %s
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -target-feature +avx512f -emit-llvm %s -o %t-avx512.ll
@@ -31,6 +33,10 @@ typedef float v4f __attribute__((vector_size(16)));
typedef float v8f __attribute__((vector_size(32)));
typedef float v16f __attribute__((vector_size(64)));
+// CIR-SSE: module {{.*}}cir.target_abi = ""
+// CIR-AVX: module {{.*}}cir.target_abi = "avx"
+// CIR-AVX512: module {{.*}}cir.target_abi = "avx512"
+
// A 128-bit vector is at or below the native vector size at every AVX level,
// so it always passes in a register.
void take_v128(v4f v) { (void)v; }
>From e2b0e0d326c4d652178e501d6912d8b8b31e361b Mon Sep 17 00:00:00 2001
From: Konstantinos Parasyris <konstantinos.parasyris at intel.com>
Date: Mon, 28 Sep 2026 16:53:52 -0700
Subject: [PATCH 2/4] Bring ast context back
---
clang/include/clang/CIR/CIRToCIRPasses.h | 12 +++++++++---
clang/include/clang/CIR/Dialect/Passes.h | 5 +++++
.../CIR/Dialect/Transforms/LoweringPrepare.cpp | 16 ++++++++++++++++
clang/lib/CIR/FrontendAction/CIRGenAction.cpp | 2 +-
clang/lib/CIR/Lowering/CIRPasses.cpp | 9 +++++----
5 files changed, 36 insertions(+), 8 deletions(-)
diff --git a/clang/include/clang/CIR/CIRToCIRPasses.h b/clang/include/clang/CIR/CIRToCIRPasses.h
index e4d2eff5baded..96ca97566ea40 100644
--- a/clang/include/clang/CIR/CIRToCIRPasses.h
+++ b/clang/include/clang/CIR/CIRToCIRPasses.h
@@ -17,6 +17,10 @@
#include <memory>
+namespace clang {
+class ASTContext;
+}
+
namespace mlir {
class MLIRContext;
class ModuleOp;
@@ -25,11 +29,13 @@ class ModuleOp;
namespace cir {
// Run set of cleanup/prepare/etc passes CIR <-> CIR.
+// `astCtx` may be null; the pipeline reads its target facts from the module.
mlir::LogicalResult
runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext &mlirCtx,
- bool enableVerifier, bool enableIdiomRecognizer,
- bool enableCIRSimplify, bool enableLibOpt,
- llvm::StringRef libOptOptions, bool enableCallConvLowering);
+ clang::ASTContext *astCtx, bool enableVerifier,
+ bool enableIdiomRecognizer, bool enableCIRSimplify,
+ bool enableLibOpt, llvm::StringRef libOptOptions,
+ bool enableCallConvLowering);
} // namespace cir
diff --git a/clang/include/clang/CIR/Dialect/Passes.h b/clang/include/clang/CIR/Dialect/Passes.h
index dedfc9fa35179..dea8c4304a51a 100644
--- a/clang/include/clang/CIR/Dialect/Passes.h
+++ b/clang/include/clang/CIR/Dialect/Passes.h
@@ -23,6 +23,10 @@ namespace cir {
enum class CallConvTarget { None, Test, X86_64 };
} // namespace cir
+namespace clang {
+class ASTContext;
+}
+
namespace mlir {
std::unique_ptr<Pass> createCIRCanonicalizePass();
@@ -39,6 +43,7 @@ createCallConvLoweringPass(cir::CallConvTarget target,
const llvm::abi::X86ABICompatInfo &x86AbiCompat);
std::unique_ptr<Pass> createHoistAllocasPass();
std::unique_ptr<Pass> createLoweringPreparePass();
+std::unique_ptr<Pass> createLoweringPreparePass(clang::ASTContext *astCtx);
std::unique_ptr<Pass> createGotoSolverPass();
std::unique_ptr<Pass> createIdiomRecognizerPass();
std::unique_ptr<Pass> createLibOptPass();
diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
index 41f253e7147e0..9a3c9c9745eaa 100644
--- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
@@ -13,6 +13,7 @@
#include "mlir/IR/IRMapping.h"
#include "mlir/IR/Location.h"
#include "mlir/IR/Value.h"
+#include "clang/AST/ASTContext.h"
#include "clang/Basic/Cuda.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/Specifiers.h"
@@ -289,6 +290,12 @@ struct LoweringPreparePass
return guard;
}
+ ///
+ /// AST related
+ /// -----------
+
+ clang::ASTContext *astCtx = nullptr;
+
/// Target/ABI facts sourced from the module's own attributes.
std::unique_ptr<cir::LowerModule> lowerModule;
@@ -571,6 +578,8 @@ struct LoweringPreparePass
builder.createYield(loc); // Outermost IfOp
}
+
+ void setASTContext(clang::ASTContext *c) { astCtx = c; }
};
} // namespace
@@ -3102,3 +3111,10 @@ void LoweringPreparePass::runOnOperation() {
std::unique_ptr<Pass> mlir::createLoweringPreparePass() {
return std::make_unique<LoweringPreparePass>();
}
+
+std::unique_ptr<Pass>
+mlir::createLoweringPreparePass(clang::ASTContext *astCtx) {
+ auto pass = std::make_unique<LoweringPreparePass>();
+ pass->setASTContext(astCtx);
+ return std::move(pass);
+}
diff --git a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp
index 47ad71e689378..901a134ec467b 100644
--- a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp
+++ b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp
@@ -165,7 +165,7 @@ class CIRGenConsumer : public clang::ASTConsumer {
const bool EnableLibOpt =
FEOptions.ClangIRLibOptEnabled && (CGO.OptimizationLevel > 0);
if (runCIRToCIRPasses(
- MlirModule, MlirCtx, !FEOptions.ClangIRDisableCIRVerifier,
+ MlirModule, MlirCtx, &C, !FEOptions.ClangIRDisableCIRVerifier,
FEOptions.ClangIREnableIdiomRecognizer, CGO.OptimizationLevel > 0,
EnableLibOpt, LibOptOptions, FEOptions.ClangIRCallConvLowering)
.failed()) {
diff --git a/clang/lib/CIR/Lowering/CIRPasses.cpp b/clang/lib/CIR/Lowering/CIRPasses.cpp
index 6e75ce03d14ff..933b98896b44e 100644
--- a/clang/lib/CIR/Lowering/CIRPasses.cpp
+++ b/clang/lib/CIR/Lowering/CIRPasses.cpp
@@ -72,9 +72,10 @@ getX86ABICompatInfo(const llvm::Triple &triple,
mlir::LogicalResult
runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext &mlirContext,
- bool enableVerifier, bool enableIdiomRecognizer,
- bool enableCIRSimplify, bool enableLibOpt,
- llvm::StringRef libOptOptions, bool enableCallConvLowering) {
+ clang::ASTContext *astContext, bool enableVerifier,
+ bool enableIdiomRecognizer, bool enableCIRSimplify,
+ bool enableLibOpt, llvm::StringRef libOptOptions,
+ bool enableCallConvLowering) {
llvm::TimeTraceScope scope("CIR To CIR Passes");
@@ -121,7 +122,7 @@ runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext &mlirContext,
// outlines dynamic global initializers into functions. It must run before
// CallConvLowering so the classifier sees them, otherwise their signatures
// go unclassified and caller and callee disagree on the ABI.
- pm.addPass(mlir::createLoweringPreparePass());
+ pm.addPass(mlir::createLoweringPreparePass(astContext));
if (enableCallConvLowering) {
// CallConvLowering rewrites signatures and call sites using the classifier,
>From dd09d08b195bdc3f97da323c9beb7d273dda637c Mon Sep 17 00:00:00 2001
From: Konstantinos Parasyris <konstantinos.parasyris at intel.com>
Date: Wed, 30 Sep 2026 16:41:13 -0700
Subject: [PATCH 3/4] Revert "Bring ast context back"
This reverts commit 4016c442e512, per review: upstream has no user of the ASTContext in the CIR-to-CIR pipeline.
Co-Authored-By: Claude Opus 5.5 <noreply at anthropic.com>
---
clang/include/clang/CIR/CIRToCIRPasses.h | 12 +++---------
clang/include/clang/CIR/Dialect/Passes.h | 5 -----
.../CIR/Dialect/Transforms/LoweringPrepare.cpp | 16 ----------------
clang/lib/CIR/FrontendAction/CIRGenAction.cpp | 2 +-
clang/lib/CIR/Lowering/CIRPasses.cpp | 9 ++++-----
5 files changed, 8 insertions(+), 36 deletions(-)
diff --git a/clang/include/clang/CIR/CIRToCIRPasses.h b/clang/include/clang/CIR/CIRToCIRPasses.h
index 96ca97566ea40..e4d2eff5baded 100644
--- a/clang/include/clang/CIR/CIRToCIRPasses.h
+++ b/clang/include/clang/CIR/CIRToCIRPasses.h
@@ -17,10 +17,6 @@
#include <memory>
-namespace clang {
-class ASTContext;
-}
-
namespace mlir {
class MLIRContext;
class ModuleOp;
@@ -29,13 +25,11 @@ class ModuleOp;
namespace cir {
// Run set of cleanup/prepare/etc passes CIR <-> CIR.
-// `astCtx` may be null; the pipeline reads its target facts from the module.
mlir::LogicalResult
runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext &mlirCtx,
- clang::ASTContext *astCtx, bool enableVerifier,
- bool enableIdiomRecognizer, bool enableCIRSimplify,
- bool enableLibOpt, llvm::StringRef libOptOptions,
- bool enableCallConvLowering);
+ bool enableVerifier, bool enableIdiomRecognizer,
+ bool enableCIRSimplify, bool enableLibOpt,
+ llvm::StringRef libOptOptions, bool enableCallConvLowering);
} // namespace cir
diff --git a/clang/include/clang/CIR/Dialect/Passes.h b/clang/include/clang/CIR/Dialect/Passes.h
index dea8c4304a51a..dedfc9fa35179 100644
--- a/clang/include/clang/CIR/Dialect/Passes.h
+++ b/clang/include/clang/CIR/Dialect/Passes.h
@@ -23,10 +23,6 @@ namespace cir {
enum class CallConvTarget { None, Test, X86_64 };
} // namespace cir
-namespace clang {
-class ASTContext;
-}
-
namespace mlir {
std::unique_ptr<Pass> createCIRCanonicalizePass();
@@ -43,7 +39,6 @@ createCallConvLoweringPass(cir::CallConvTarget target,
const llvm::abi::X86ABICompatInfo &x86AbiCompat);
std::unique_ptr<Pass> createHoistAllocasPass();
std::unique_ptr<Pass> createLoweringPreparePass();
-std::unique_ptr<Pass> createLoweringPreparePass(clang::ASTContext *astCtx);
std::unique_ptr<Pass> createGotoSolverPass();
std::unique_ptr<Pass> createIdiomRecognizerPass();
std::unique_ptr<Pass> createLibOptPass();
diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
index 9a3c9c9745eaa..41f253e7147e0 100644
--- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
@@ -13,7 +13,6 @@
#include "mlir/IR/IRMapping.h"
#include "mlir/IR/Location.h"
#include "mlir/IR/Value.h"
-#include "clang/AST/ASTContext.h"
#include "clang/Basic/Cuda.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/Specifiers.h"
@@ -290,12 +289,6 @@ struct LoweringPreparePass
return guard;
}
- ///
- /// AST related
- /// -----------
-
- clang::ASTContext *astCtx = nullptr;
-
/// Target/ABI facts sourced from the module's own attributes.
std::unique_ptr<cir::LowerModule> lowerModule;
@@ -578,8 +571,6 @@ struct LoweringPreparePass
builder.createYield(loc); // Outermost IfOp
}
-
- void setASTContext(clang::ASTContext *c) { astCtx = c; }
};
} // namespace
@@ -3111,10 +3102,3 @@ void LoweringPreparePass::runOnOperation() {
std::unique_ptr<Pass> mlir::createLoweringPreparePass() {
return std::make_unique<LoweringPreparePass>();
}
-
-std::unique_ptr<Pass>
-mlir::createLoweringPreparePass(clang::ASTContext *astCtx) {
- auto pass = std::make_unique<LoweringPreparePass>();
- pass->setASTContext(astCtx);
- return std::move(pass);
-}
diff --git a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp
index 901a134ec467b..47ad71e689378 100644
--- a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp
+++ b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp
@@ -165,7 +165,7 @@ class CIRGenConsumer : public clang::ASTConsumer {
const bool EnableLibOpt =
FEOptions.ClangIRLibOptEnabled && (CGO.OptimizationLevel > 0);
if (runCIRToCIRPasses(
- MlirModule, MlirCtx, &C, !FEOptions.ClangIRDisableCIRVerifier,
+ MlirModule, MlirCtx, !FEOptions.ClangIRDisableCIRVerifier,
FEOptions.ClangIREnableIdiomRecognizer, CGO.OptimizationLevel > 0,
EnableLibOpt, LibOptOptions, FEOptions.ClangIRCallConvLowering)
.failed()) {
diff --git a/clang/lib/CIR/Lowering/CIRPasses.cpp b/clang/lib/CIR/Lowering/CIRPasses.cpp
index 933b98896b44e..6e75ce03d14ff 100644
--- a/clang/lib/CIR/Lowering/CIRPasses.cpp
+++ b/clang/lib/CIR/Lowering/CIRPasses.cpp
@@ -72,10 +72,9 @@ getX86ABICompatInfo(const llvm::Triple &triple,
mlir::LogicalResult
runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext &mlirContext,
- clang::ASTContext *astContext, bool enableVerifier,
- bool enableIdiomRecognizer, bool enableCIRSimplify,
- bool enableLibOpt, llvm::StringRef libOptOptions,
- bool enableCallConvLowering) {
+ bool enableVerifier, bool enableIdiomRecognizer,
+ bool enableCIRSimplify, bool enableLibOpt,
+ llvm::StringRef libOptOptions, bool enableCallConvLowering) {
llvm::TimeTraceScope scope("CIR To CIR Passes");
@@ -122,7 +121,7 @@ runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext &mlirContext,
// outlines dynamic global initializers into functions. It must run before
// CallConvLowering so the classifier sees them, otherwise their signatures
// go unclassified and caller and callee disagree on the ABI.
- pm.addPass(mlir::createLoweringPreparePass(astContext));
+ pm.addPass(mlir::createLoweringPreparePass());
if (enableCallConvLowering) {
// CallConvLowering rewrites signatures and call sites using the classifier,
>From f41c172725569664b742b91408886315f3f71cc7 Mon Sep 17 00:00:00 2001
From: Konstantinos Parasyris <konstantinos.parasyris at intel.com>
Date: Wed, 30 Sep 2026 16:53:27 -0700
Subject: [PATCH 4/4] Remove clangAST from cmake
---
clang/lib/CIR/Dialect/Transforms/CMakeLists.txt | 1 -
clang/lib/CIR/Dialect/Transforms/LibOpt.cpp | 2 --
2 files changed, 3 deletions(-)
diff --git a/clang/lib/CIR/Dialect/Transforms/CMakeLists.txt b/clang/lib/CIR/Dialect/Transforms/CMakeLists.txt
index 82078bf2e8f73..3678fc0b25384 100644
--- a/clang/lib/CIR/Dialect/Transforms/CMakeLists.txt
+++ b/clang/lib/CIR/Dialect/Transforms/CMakeLists.txt
@@ -19,7 +19,6 @@ add_clang_library(MLIRCIRTransforms
MLIRCIRPassIncGen
LINK_LIBS PUBLIC
- clangAST
clangBasic
LLVMABI
diff --git a/clang/lib/CIR/Dialect/Transforms/LibOpt.cpp b/clang/lib/CIR/Dialect/Transforms/LibOpt.cpp
index 92a9339545931..71db03827d3c6 100644
--- a/clang/lib/CIR/Dialect/Transforms/LibOpt.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LibOpt.cpp
@@ -14,8 +14,6 @@
#include "mlir/Dialect/Func/IR/FuncOps.h"
#include "mlir/IR/BuiltinAttributes.h"
#include "mlir/IR/Region.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/AST/Mangle.h"
#include "clang/Basic/Module.h"
#include "clang/CIR/Dialect/Builder/CIRBaseBuilder.h"
#include "clang/CIR/Dialect/IR/CIRDialect.h"
More information about the cfe-commits
mailing list