llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Jiahao Guo (E00N777)

<details>
<summary>Changes</summary>

### summary 

This is follow-up to https://github.com/llvm/llvm-project/pull/199599

A CIR op can set the llvmOp field to have cir-tblgen auto-generate its CIR→LLVM 
lowering instead of using a hand-written pattern.However, the generated body 
forwards the result type via op.getType(), which only compiles for 
single-result ops. As a result, ops with zero results could not use this 
feature.

To fix this, teach CIRLoweringEmitter to emit an empty mlir::TypeRange{} for 
zero-result ops. Then switch cir.lifetime.start and cir.lifetime.end to use 
llvmOp (dropping their hand-written lowering). The lifetime.cir test covers the 
generated path.


---
Full diff: https://github.com/llvm/llvm-project/pull/202273.diff


3 Files Affected:

- (modified) clang/include/clang/CIR/Dialect/IR/CIROps.td (+2) 
- (modified) clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp (-15) 
- (modified) clang/utils/TableGen/CIRLoweringEmitter.cpp (+13-6) 


``````````diff
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td 
b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 29644fa35aa740..1e054577755770 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 39ab2dc359958d..c7eccd2f19c197 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 d7417ee38875ea..dc2151e3f6c098 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.

``````````

</details>


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

Reply via email to