[mlir] FuncToLLVM: fail gracefully in bare pointer multi-result covnersion
authorAlex Zinenko <zinenko@google.com>
Mon, 27 Mar 2023 14:53:11 +0000 (14:53 +0000)
committerAlex Zinenko <zinenko@google.com>
Mon, 27 Mar 2023 14:53:11 +0000 (14:53 +0000)
When type conversion fails, return pattern failure instead of crashing.

Closes #61717.

mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp
mlir/test/Conversion/FuncToLLVM/func-memref-return.mlir

index bbfb628..7200b2b 100644 (file)
@@ -675,6 +675,9 @@ struct ReturnOpLowering : public ConvertOpToLLVMPattern<func::ReturnOp> {
     // returning.
     auto packedType =
         getTypeConverter()->packFunctionResults(op.getOperandTypes());
+    if (!packedType) {
+      return rewriter.notifyMatchFailure(op, "could not convert result types");
+    }
 
     Value packed = rewriter.create<LLVM::UndefOp>(loc, packedType);
     for (auto [idx, operand] : llvm::enumerate(updatedOperands)) {
index e8f73a3..8663ce8 100644 (file)
@@ -95,3 +95,11 @@ func.func @check_return(%in : memref<?xi8>) -> memref<?xi8> {
   // BAREPTR: llvm.return {{.*}} : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
   return %in : memref<?xi8>
 }
+
+// -----
+
+// BAREPTR-LABEL: func @unconvertible_multiresult
+// BAREPTR-SAME: %{{.*}}: memref<?xf32>, %{{.*}}: memref<?xf32>) -> (memref<?xf32>, memref<?xf32>)
+func.func @unconvertible_multiresult(%arg0: memref<?xf32> , %arg1: memref<?xf32>) -> (memref<?xf32>, memref<?xf32>) {
+  return %arg0, %arg1 : memref<?xf32>, memref<?xf32>
+}