summaryrefslogtreecommitdiff
path: root/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
diff options
context:
space:
mode:
authorHendrik Hübner <117831077+HendrikHuebner@users.noreply.github.com>2025-11-14 00:00:52 +0100
committerGitHub <noreply@github.com>2025-11-13 15:00:52 -0800
commit3ff3c4eba5d536a578abef6bf1d8520591b26dc2 (patch)
tree31170def8100d2a3a37ad79f121f2b60b3f6e368 /clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
parent36848a3710bf8376f5ec9cb03df684a4b889e343 (diff)
[CIR] Upstream X86 builtin clflush, fence and pause (#167401)
This PR upstreams the intrinsics `_mm_prefetch`, `_mm_(l|m)fenche`, `_mm_pause` and `_mm_clflush` from the incubator repository.
Diffstat (limited to 'clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp')
-rw-r--r--clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index b4afed701941..d88a4ad76f27 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -320,6 +320,30 @@ static mlir::LLVM::CallIntrinsicOp replaceOpWithCallLLVMIntrinsicOp(
return callIntrinOp;
}
+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");
+ StringRef name = op.getIntrinsicName();
+
+ // Some LLVM intrinsics require ElementType attribute to be attached to
+ // the argument of pointer type. That prevents us from generating LLVM IR
+ // because from LLVM dialect, we have LLVM IR like the below which fails
+ // LLVM IR verification.
+ // %3 = call i64 @llvm.aarch64.ldxr.p0(ptr %2)
+ // The expected LLVM IR should be like
+ // %3 = call i64 @llvm.aarch64.ldxr.p0(ptr elementtype(i32) %2)
+ // TODO(cir): MLIR LLVM dialect should handle this part as CIR has no way
+ // to set LLVM IR attribute.
+ assert(!cir::MissingFeatures::intrinsicElementTypeSupport());
+ replaceOpWithCallLLVMIntrinsicOp(rewriter, op, "llvm." + name, llvmResTy,
+ adaptor.getOperands());
+ return mlir::success();
+}
+
/// IntAttr visitor.
mlir::Value CIRAttrToValue::visitCirAttr(cir::IntAttr intAttr) {
mlir::Location loc = parentOp->getLoc();