@@ -267,6 +267,26 @@ void convertSideEffectForCall(mlir::Operation *callOp, bool isNothrow,
267
267
}
268
268
}
269
269
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
+
270
290
// / IntAttr visitor.
271
291
mlir::Value CIRAttrToValue::visitCirAttr (cir::IntAttr intAttr) {
272
292
mlir::Location loc = parentOp->getLoc ();
@@ -1112,6 +1132,24 @@ mlir::LogicalResult CIRToLLVMCallOpLowering::matchAndRewrite(
1112
1132
getTypeConverter (), op.getCalleeAttr ());
1113
1133
}
1114
1134
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
+
1115
1153
mlir::LogicalResult CIRToLLVMLoadOpLowering::matchAndRewrite (
1116
1154
cir::LoadOp op, OpAdaptor adaptor,
1117
1155
mlir::ConversionPatternRewriter &rewriter) const {
@@ -2322,10 +2360,12 @@ void ConvertCIRToLLVMPass::runOnOperation() {
2322
2360
CIRToLLVMConstantOpLowering,
2323
2361
CIRToLLVMExpectOpLowering,
2324
2362
CIRToLLVMFAbsOpLowering,
2363
+ CIRToLLVMFrameAddrOpLowering,
2325
2364
CIRToLLVMFuncOpLowering,
2326
2365
CIRToLLVMGetBitfieldOpLowering,
2327
2366
CIRToLLVMGetGlobalOpLowering,
2328
2367
CIRToLLVMGetMemberOpLowering,
2368
+ CIRToLLVMReturnAddrOpLowering,
2329
2369
CIRToLLVMRotateOpLowering,
2330
2370
CIRToLLVMSelectOpLowering,
2331
2371
CIRToLLVMSetBitfieldOpLowering,
0 commit comments