[clang] [CIR] Correctly pass func self-comdat & alignment (PR #223773)
Bruno Cardoso Lopes via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 17 13:50:07 PDT 2026
================
@@ -3142,37 +3149,53 @@ mlir::LogicalResult CIRToLLVMGlobalOpLowering::matchAndRewrite(
return mlir::success();
}
-mlir::SymbolRefAttr
-CIRToLLVMGlobalOpLowering::getComdatAttr(cir::GlobalOp &op,
- mlir::OpBuilder &builder) const {
- if (!op.getComdat())
- return mlir::SymbolRefAttr{};
-
- mlir::ModuleOp modOp = op->getParentOfType<mlir::ModuleOp>();
+static mlir::SymbolRefAttr getComdatAttrHelper(mlir::ModuleOp modOp,
+ mlir::OpBuilder &builder,
+ StringRef symName,
+ mlir::LLVM::ComdatOp &comdatOp,
+ StringRef comdatName) {
mlir::OpBuilder::InsertionGuard guard(builder);
- StringRef comdatName("__llvm_comdat_globals");
if (!comdatOp) {
builder.setInsertionPointToStart(modOp.getBody());
comdatOp =
mlir::LLVM::ComdatOp::create(builder, modOp.getLoc(), comdatName);
}
- if (auto comdatSelector = comdatOp.lookupSymbol<mlir::LLVM::ComdatSelectorOp>(
- op.getSymName())) {
+ if (auto comdatSelector =
+ comdatOp.lookupSymbol<mlir::LLVM::ComdatSelectorOp>(symName)) {
return mlir::SymbolRefAttr::get(
builder.getContext(), comdatName,
mlir::FlatSymbolRefAttr::get(comdatSelector.getSymNameAttr()));
}
builder.setInsertionPointToStart(&comdatOp.getBody().back());
auto selectorOp = mlir::LLVM::ComdatSelectorOp::create(
- builder, comdatOp.getLoc(), op.getSymName(),
- mlir::LLVM::comdat::Comdat::Any, /*sym_visibility=*/nullptr);
+ builder, comdatOp.getLoc(), symName, mlir::LLVM::comdat::Comdat::Any,
+ /*sym_visibility=*/nullptr);
return mlir::SymbolRefAttr::get(
builder.getContext(), comdatName,
mlir::FlatSymbolRefAttr::get(selectorOp.getSymNameAttr()));
}
+mlir::SymbolRefAttr
+CIRToLLVMGlobalOpLowering::getComdatAttr(cir::GlobalOp &op,
+ mlir::OpBuilder &builder) const {
+ if (!op.getComdat())
+ return mlir::SymbolRefAttr{};
+ return getComdatAttrHelper(op->getParentOfType<mlir::ModuleOp>(), builder,
+ op.getSymName(), comdatOp,
+ "__llvm_comdat_globals");
+}
+
+mlir::SymbolRefAttr
+CIRToLLVMFuncOpLowering::getComdatAttr(cir::FuncOp &op,
+ mlir::OpBuilder &builder) const {
+ if (!op.getComdat())
+ return mlir::SymbolRefAttr{};
+ return getComdatAttrHelper(op->getParentOfType<mlir::ModuleOp>(), builder,
+ op.getSymName(), comdatOp, "__llvm_comdat_funcs");
----------------
bcardosolopes wrote:
Why a second comdat region rather than reusing `__llvm_comdat_globals`? LLVM has one comdat table per module, and this gives the module two `llvm.comdat` ops that translation then merges back into one.
Reads like it fell out of the caching rather than being intended: `comdatOp` is a `mutable` member on each lowering pattern, so the two patterns can't share a cache without somewhere common to hang it. If that's the reason, fine, but might be worth saying it here, because right now it looks like a deliberate split of the comdat table (and it isn't one).
https://github.com/llvm/llvm-project/pull/223773
More information about the cfe-commits
mailing list