@@ -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 mlir::LLVM::CallIntrinsicOp::create (rewriter, loc, resultTy,
277+ 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 ();
@@ -1112,6 +1132,24 @@ mlir::LogicalResult CIRToLLVMCallOpLowering::matchAndRewrite(
11121132 getTypeConverter (), op.getCalleeAttr ());
11131133}
11141134
1135+ mlir::LogicalResult CIRToLLVMReturnAddrOpLowering::matchAndRewrite (
1136+ cir::ReturnAddrOp op, OpAdaptor adaptor,
1137+ mlir::ConversionPatternRewriter &rewriter) const {
1138+ auto llvmPtrTy = mlir::LLVM::LLVMPointerType::get (rewriter.getContext ());
1139+ replaceOpWithCallLLVMIntrinsicOp (rewriter, op, " llvm.returnaddress" ,
1140+ llvmPtrTy, adaptor.getOperands ());
1141+ return mlir::success ();
1142+ }
1143+
1144+ mlir::LogicalResult CIRToLLVMFrameAddrOpLowering::matchAndRewrite (
1145+ cir::FrameAddrOp op, OpAdaptor adaptor,
1146+ mlir::ConversionPatternRewriter &rewriter) const {
1147+ auto llvmPtrTy = mlir::LLVM::LLVMPointerType::get (rewriter.getContext ());
1148+ replaceOpWithCallLLVMIntrinsicOp (rewriter, op, " llvm.frameaddress" , llvmPtrTy,
1149+ adaptor.getOperands ());
1150+ return mlir::success ();
1151+ }
1152+
11151153mlir::LogicalResult CIRToLLVMLoadOpLowering::matchAndRewrite (
11161154 cir::LoadOp op, OpAdaptor adaptor,
11171155 mlir::ConversionPatternRewriter &rewriter) const {
@@ -2322,10 +2360,12 @@ void ConvertCIRToLLVMPass::runOnOperation() {
23222360 CIRToLLVMConstantOpLowering,
23232361 CIRToLLVMExpectOpLowering,
23242362 CIRToLLVMFAbsOpLowering,
2363+ CIRToLLVMFrameAddrOpLowering,
23252364 CIRToLLVMFuncOpLowering,
23262365 CIRToLLVMGetBitfieldOpLowering,
23272366 CIRToLLVMGetGlobalOpLowering,
23282367 CIRToLLVMGetMemberOpLowering,
2368+ CIRToLLVMReturnAddrOpLowering,
23292369 CIRToLLVMRotateOpLowering,
23302370 CIRToLLVMSelectOpLowering,
23312371 CIRToLLVMSetBitfieldOpLowering,
0 commit comments