[clang] [CIR] Support zero-result ops in clangir TableGen lowering (PR #202273)
Jiahao Guo via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 8 00:23:15 PDT 2026
https://github.com/E00N777 updated https://github.com/llvm/llvm-project/pull/202273
>From 37db106233b35a53d97a918201eaf3fa4f483d53 Mon Sep 17 00:00:00 2001
From: E0N777 <E0N_gjh at 163.com>
Date: Mon, 8 Jun 2026 15:11:04 +0800
Subject: [PATCH] [CIR] Support zero-result ops in clangir TableGen lowering
---
clang/include/clang/CIR/Dialect/IR/CIROps.td | 2 ++
.../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 15 ---------------
clang/utils/TableGen/CIRLoweringEmitter.cpp | 19 +++++++++++++------
3 files changed, 15 insertions(+), 21 deletions(-)
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 29644fa35aa74..1e05457775577 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -4876,6 +4876,7 @@ def CIR_LifetimeStartOp : CIR_Op<"lifetime.start"> {
let arguments = (ins CIR_PointerType:$ptr);
let assemblyFormat = "$ptr attr-dict `:` qualified(type($ptr))";
let hasVerifier = 1;
+ let llvmOp = "LifetimeStartOp";
}
def CIR_LifetimeEndOp : CIR_Op<"lifetime.end"> {
@@ -4911,6 +4912,7 @@ def CIR_LifetimeEndOp : CIR_Op<"lifetime.end"> {
let arguments = (ins CIR_PointerType:$ptr);
let assemblyFormat = "$ptr attr-dict `:` qualified(type($ptr))";
let hasVerifier = 1;
+ let llvmOp = "LifetimeEndOp";
}
//===----------------------------------------------------------------------===//
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 39ab2dc359958..c7eccd2f19c19 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -4156,21 +4156,6 @@ mlir::LogicalResult CIRToLLVMStackRestoreOpLowering::matchAndRewrite(
return mlir::success();
}
-mlir::LogicalResult CIRToLLVMLifetimeStartOpLowering::matchAndRewrite(
- cir::LifetimeStartOp op, OpAdaptor adaptor,
- mlir::ConversionPatternRewriter &rewriter) const {
- rewriter.replaceOpWithNewOp<mlir::LLVM::LifetimeStartOp>(op,
- adaptor.getPtr());
- return mlir::success();
-}
-
-mlir::LogicalResult CIRToLLVMLifetimeEndOpLowering::matchAndRewrite(
- cir::LifetimeEndOp op, OpAdaptor adaptor,
- mlir::ConversionPatternRewriter &rewriter) const {
- rewriter.replaceOpWithNewOp<mlir::LLVM::LifetimeEndOp>(op, adaptor.getPtr());
- return mlir::success();
-}
-
mlir::LogicalResult CIRToLLVMVecCreateOpLowering::matchAndRewrite(
cir::VecCreateOp op, OpAdaptor adaptor,
mlir::ConversionPatternRewriter &rewriter) const {
diff --git a/clang/utils/TableGen/CIRLoweringEmitter.cpp b/clang/utils/TableGen/CIRLoweringEmitter.cpp
index d7417ee38875e..4c4d0c370e4cd 100644
--- a/clang/utils/TableGen/CIRLoweringEmitter.cpp
+++ b/clang/utils/TableGen/CIRLoweringEmitter.cpp
@@ -138,7 +138,7 @@ void GenerateLLVMLoweringPattern(llvm::StringRef OpName,
llvm::StringRef PatternName, bool IsRecursive,
llvm::StringRef ExtraDecl,
const Record *CustomCtorRec,
- llvm::StringRef LLVMOp) {
+ llvm::StringRef LLVMOp, bool IsZeroResult) {
std::optional<CustomLoweringCtor> CustomCtor =
parseCustomLoweringCtor(CustomCtorRec);
std::string CodeBuffer;
@@ -188,10 +188,15 @@ void GenerateLLVMLoweringPattern(llvm::StringRef OpName,
<< " mlir::LogicalResult matchAndRewrite(cir::" << OpName
<< " op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) "
"const override {\n";
- Code
- << " mlir::Type resTy = typeConverter->convertType(op.getType());\n";
- Code << " rewriter.replaceOpWithNewOp<mlir::LLVM::" << LLVMOp
- << ">(op, resTy, adaptor.getOperands());\n";
+ if (IsZeroResult) {
+ Code << " rewriter.replaceOpWithNewOp<mlir::LLVM::" << LLVMOp
+ << ">(op, mlir::TypeRange{}, adaptor.getOperands());\n";
+ } else {
+ Code << " mlir::Type resTy = "
+ "typeConverter->convertType(op.getType());\n";
+ Code << " rewriter.replaceOpWithNewOp<mlir::LLVM::" << LLVMOp
+ << ">(op, resTy, adaptor.getOperands());\n";
+ }
Code << " return mlir::success();\n";
Code << " }\n";
} else {
@@ -236,8 +241,10 @@ void Generate(const Record *OpRecord) {
"' has both llvmOp and a custom lowering "
"constructor, which is not supported");
+ const DagInit *ResultsDag = OpRecord->getValueAsDag("results");
+ bool IsZeroResult = ResultsDag->getNumArgs() == 0;
GenerateLLVMLoweringPattern(OpName, PatternName, IsRecursive, ExtraDecl,
- CustomCtor, LLVMOp);
+ CustomCtor, LLVMOp, IsZeroResult);
// Only automatically register patterns that use the default constructor.
// Patterns with a custom constructor must be manually registered by the
// lowering pass.
More information about the cfe-commits
mailing list