[clang] [CIR] Support void calls in cir.call_llvm_intrinsic lowering (PR #199516)
via cfe-commits
cfe-commits at lists.llvm.org
Mon May 25 04:40:33 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clangir
Author: Chaitanya (skc7)
<details>
<summary>Changes</summary>
`LowerToLLVM` module now skips type conversion when the op has zero results and selects the void or single-result `CallIntrinsicOp::create` overload to support void return type builtins lowering.
---
Full diff: https://github.com/llvm/llvm-project/pull/199516.diff
1 Files Affected:
- (modified) clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp (+14-6)
``````````diff
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index c4e98e299dfc1..8940272d27ffe 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -358,8 +358,12 @@ createCallLLVMIntrinsicOp(mlir::ConversionPatternRewriter &rewriter,
mlir::Type resultTy, mlir::ValueRange operands) {
auto intrinsicNameAttr =
mlir::StringAttr::get(rewriter.getContext(), intrinsicName);
- return mlir::LLVM::CallIntrinsicOp::create(rewriter, loc, resultTy,
- intrinsicNameAttr, operands);
+ // CallIntrinsicOp has distinct void / single-result create overloads.
+ if (resultTy)
+ return mlir::LLVM::CallIntrinsicOp::create(rewriter, loc, resultTy,
+ intrinsicNameAttr, operands);
+ return mlir::LLVM::CallIntrinsicOp::create(rewriter, loc, intrinsicNameAttr,
+ operands);
}
static mlir::LLVM::CallIntrinsicOp replaceOpWithCallLLVMIntrinsicOp(
@@ -375,10 +379,14 @@ static mlir::LLVM::CallIntrinsicOp replaceOpWithCallLLVMIntrinsicOp(
mlir::LogicalResult CIRToLLVMLLVMIntrinsicCallOpLowering::matchAndRewrite(
cir::LLVMIntrinsicCallOp op, OpAdaptor adaptor,
mlir::ConversionPatternRewriter &rewriter) const {
- mlir::Type llvmResTy =
- getTypeConverter()->convertType(op->getResultTypes()[0]);
- if (!llvmResTy)
- return op.emitError("expected LLVM result type");
+ // Result is Optional on the op, so void intrinsics have zero
+ // results; leave llvmResTy null in that case.
+ mlir::Type llvmResTy;
+ if (op->getNumResults() != 0) {
+ llvmResTy = getTypeConverter()->convertType(op->getResultTypes()[0]);
+ if (!llvmResTy)
+ return op.emitError("expected LLVM result type");
+ }
StringRef name = op.getIntrinsicName();
// Some LLVM intrinsics require ElementType attribute to be attached to
``````````
</details>
https://github.com/llvm/llvm-project/pull/199516
More information about the cfe-commits
mailing list