@@ -267,6 +267,26 @@ void convertSideEffectForCall(mlir::Operation *callOp, bool isNothrow,
267267 }
268268}
269269
270+ static mlir::LLVM::CallIntrinsicOp
271+ createCallLLVMIntrinsicOp (mlir::ConversionPatternRewriter &rewriter,
272+ mlir::Location loc, const llvm::Twine &intrinsicName,
273+ mlir::Type resultTy, mlir::ValueRange operands) {
274+ auto intrinsicNameAttr =
275+ mlir::StringAttr::get (rewriter.getContext (), intrinsicName);
276+ return rewriter.create <mlir::LLVM::CallIntrinsicOp>(
277+ loc, resultTy, intrinsicNameAttr, operands);
278+ }
279+
280+ static mlir::LLVM::CallIntrinsicOp replaceOpWithCallLLVMIntrinsicOp (
281+ mlir::ConversionPatternRewriter &rewriter, mlir::Operation *op,
282+ const llvm::Twine &intrinsicName, mlir::Type resultTy,
283+ mlir::ValueRange operands) {
284+ mlir::LLVM::CallIntrinsicOp callIntrinOp = createCallLLVMIntrinsicOp (
285+ rewriter, op->getLoc (), intrinsicName, resultTy, operands);
286+ rewriter.replaceOp (op, callIntrinOp.getOperation ());
287+ return callIntrinOp;
288+ }
289+
270290// / IntAttr visitor.
271291mlir::Value CIRAttrToValue::visitCirAttr (cir::IntAttr intAttr) {
272292 mlir::Location loc = parentOp->getLoc ();
@@ -1097,6 +1117,24 @@ mlir::LogicalResult CIRToLLVMCallOpLowering::matchAndRewrite(
10971117 getTypeConverter (), op.getCalleeAttr ());
10981118}
10991119
1120+ mlir::LogicalResult CIRToLLVMReturnAddrOpLowering::matchAndRewrite (
1121+ cir::ReturnAddrOp op, OpAdaptor adaptor,
1122+ mlir::ConversionPatternRewriter &rewriter) const {
1123+ auto llvmPtrTy = mlir::LLVM::LLVMPointerType::get (rewriter.getContext ());
1124+ replaceOpWithCallLLVMIntrinsicOp (rewriter, op, " llvm.returnaddress" ,
1125+ llvmPtrTy, adaptor.getOperands ());
1126+ return mlir::success ();
1127+ }
1128+
1129+ mlir::LogicalResult CIRToLLVMFrameAddrOpLowering::matchAndRewrite (
1130+ cir::FrameAddrOp op, OpAdaptor adaptor,
1131+ mlir::ConversionPatternRewriter &rewriter) const {
1132+ auto llvmPtrTy = mlir::LLVM::LLVMPointerType::get (rewriter.getContext ());
1133+ replaceOpWithCallLLVMIntrinsicOp (rewriter, op, " llvm.frameaddress" , llvmPtrTy,
1134+ adaptor.getOperands ());
1135+ return mlir::success ();
1136+ }
1137+
11001138mlir::LogicalResult CIRToLLVMLoadOpLowering::matchAndRewrite (
11011139 cir::LoadOp op, OpAdaptor adaptor,
11021140 mlir::ConversionPatternRewriter &rewriter) const {
@@ -2307,10 +2345,12 @@ void ConvertCIRToLLVMPass::runOnOperation() {
23072345 CIRToLLVMConstantOpLowering,
23082346 CIRToLLVMExpectOpLowering,
23092347 CIRToLLVMFAbsOpLowering,
2348+ CIRToLLVMFrameAddrOpLowering,
23102349 CIRToLLVMFuncOpLowering,
23112350 CIRToLLVMGetBitfieldOpLowering,
23122351 CIRToLLVMGetGlobalOpLowering,
23132352 CIRToLLVMGetMemberOpLowering,
2353+ CIRToLLVMReturnAddrOpLowering,
23142354 CIRToLLVMRotateOpLowering,
23152355 CIRToLLVMSelectOpLowering,
23162356 CIRToLLVMSetBitfieldOpLowering,
0 commit comments