@@ -651,6 +651,50 @@ mlir::LogicalResult CIRToLLVMReturnOpLowering::matchAndRewrite(
651651 return mlir::LogicalResult::success ();
652652}
653653
654+ static mlir::LogicalResult
655+ rewriteCallOrInvoke (mlir::Operation *op, mlir::ValueRange callOperands,
656+ mlir::ConversionPatternRewriter &rewriter,
657+ const mlir::TypeConverter *converter,
658+ mlir::FlatSymbolRefAttr calleeAttr) {
659+ llvm::SmallVector<mlir::Type, 8 > llvmResults;
660+ mlir::ValueTypeRange<mlir::ResultRange> cirResults = op->getResultTypes ();
661+
662+ if (converter->convertTypes (cirResults, llvmResults).failed ())
663+ return mlir::failure ();
664+
665+ assert (!cir::MissingFeatures::opCallCallConv ());
666+ assert (!cir::MissingFeatures::opCallSideEffect ());
667+
668+ mlir::LLVM::LLVMFunctionType llvmFnTy;
669+ if (calleeAttr) { // direct call
670+ mlir::FunctionOpInterface fn =
671+ mlir::SymbolTable::lookupNearestSymbolFrom<mlir::FunctionOpInterface>(
672+ op, calleeAttr);
673+ assert (fn && " Did not find function for call" );
674+ llvmFnTy = cast<mlir::LLVM::LLVMFunctionType>(
675+ converter->convertType (fn.getFunctionType ()));
676+ } else { // indirect call
677+ assert (!cir::MissingFeatures::opCallIndirect ());
678+ return op->emitError (" Indirect calls are NYI" );
679+ }
680+
681+ assert (!cir::MissingFeatures::opCallLandingPad ());
682+ assert (!cir::MissingFeatures::opCallContinueBlock ());
683+ assert (!cir::MissingFeatures::opCallCallConv ());
684+ assert (!cir::MissingFeatures::opCallSideEffect ());
685+
686+ rewriter.replaceOpWithNewOp <mlir::LLVM::CallOp>(op, llvmFnTy, calleeAttr,
687+ callOperands);
688+ return mlir::success ();
689+ }
690+
691+ mlir::LogicalResult CIRToLLVMCallOpLowering::matchAndRewrite (
692+ cir::CallOp op, OpAdaptor adaptor,
693+ mlir::ConversionPatternRewriter &rewriter) const {
694+ return rewriteCallOrInvoke (op.getOperation (), adaptor.getOperands (), rewriter,
695+ getTypeConverter (), op.getCalleeAttr ());
696+ }
697+
654698mlir::LogicalResult CIRToLLVMLoadOpLowering::matchAndRewrite (
655699 cir::LoadOp op, OpAdaptor adaptor,
656700 mlir::ConversionPatternRewriter &rewriter) const {
@@ -1589,6 +1633,7 @@ void ConvertCIRToLLVMPass::runOnOperation() {
15891633 CIRToLLVMBinOpLowering,
15901634 CIRToLLVMBrCondOpLowering,
15911635 CIRToLLVMBrOpLowering,
1636+ CIRToLLVMCallOpLowering,
15921637 CIRToLLVMCmpOpLowering,
15931638 CIRToLLVMConstantOpLowering,
15941639 CIRToLLVMFuncOpLowering,
0 commit comments