[Mlir-commits] [mlir] [mlir][arith] Fix type conversion in emulate-wide-int (PR #112104)

Jakub Kuderski llvmlistbot at llvm.org
Sat Oct 12 10:48:19 PDT 2024


https://github.com/kuhar created https://github.com/llvm/llvm-project/pull/112104

Use `nullptr` to indicate that type conversion failed and no fallback conversion should be attempted.

Fixes: https://github.com/llvm/llvm-project/issues/108163

>From a6da7e8ba9b0fffb084d053fb9f6b59af007bc10 Mon Sep 17 00:00:00 2001
From: Jakub Kuderski <jakub at nod-labs.com>
Date: Sat, 12 Oct 2024 13:42:28 -0400
Subject: [PATCH] [mlir][arith] Fix type conversion in emulate-wide-int

Use `nullptr` to indicate that type conversion failed and no fallback
conversion should be attempted.

Fixes: https://github.com/llvm/llvm-project/issues/108163
---
 .../Arith/Transforms/EmulateWideInt.cpp       |  8 ++--
 .../Arith/emulate-wide-int-unsupported.mlir   | 43 +++++++++++++++++++
 2 files changed, 47 insertions(+), 4 deletions(-)
 create mode 100644 mlir/test/Dialect/Arith/emulate-wide-int-unsupported.mlir

diff --git a/mlir/lib/Dialect/Arith/Transforms/EmulateWideInt.cpp b/mlir/lib/Dialect/Arith/Transforms/EmulateWideInt.cpp
index c48ded094eacff..2d49854347d406 100644
--- a/mlir/lib/Dialect/Arith/Transforms/EmulateWideInt.cpp
+++ b/mlir/lib/Dialect/Arith/Transforms/EmulateWideInt.cpp
@@ -1081,7 +1081,7 @@ arith::WideIntEmulationConverter::WideIntEmulationConverter(
     if (width == 2 * maxIntWidth)
       return VectorType::get(2, IntegerType::get(ty.getContext(), maxIntWidth));
 
-    return std::nullopt;
+    return nullptr;
   });
 
   // Vector case.
@@ -1102,7 +1102,7 @@ arith::WideIntEmulationConverter::WideIntEmulationConverter(
                              IntegerType::get(ty.getContext(), maxIntWidth));
     }
 
-    return std::nullopt;
+    return nullptr;
   });
 
   // Function case.
@@ -1111,11 +1111,11 @@ arith::WideIntEmulationConverter::WideIntEmulationConverter(
     //   (i2N, i2N) -> i2N --> (vector<2xiN>, vector<2xiN>) -> vector<2xiN>
     SmallVector<Type> inputs;
     if (failed(convertTypes(ty.getInputs(), inputs)))
-      return std::nullopt;
+      return nullptr;
 
     SmallVector<Type> results;
     if (failed(convertTypes(ty.getResults(), results)))
-      return std::nullopt;
+      return nullptr;
 
     return FunctionType::get(ty.getContext(), inputs, results);
   });
diff --git a/mlir/test/Dialect/Arith/emulate-wide-int-unsupported.mlir b/mlir/test/Dialect/Arith/emulate-wide-int-unsupported.mlir
new file mode 100644
index 00000000000000..586bd632f19721
--- /dev/null
+++ b/mlir/test/Dialect/Arith/emulate-wide-int-unsupported.mlir
@@ -0,0 +1,43 @@
+// RUN: mlir-opt --arith-emulate-wide-int="widest-int-supported=32" \
+// RUN:   --split-input-file --verify-diagnostics %s
+
+// Make sure we do not crash on unsupported types.
+
+// Unsupported result type in `arith.extsi`.
+func.func @unsupported_result_integer(%arg0: i64) -> i64 {
+  // expected-error at +1 {{failed to legalize operation 'arith.extsi' that was explicitly marked illegal}}
+  %0 = arith.extsi %arg0: i64 to i128
+  %2 = arith.muli %0, %0 : i128
+  %3 = arith.trunci %2 : i128 to i64
+  return %3 : i64
+}
+
+// -----
+
+// Unsupported result type in `arith.extsi`.
+func.func @unsupported_result_vector(%arg0: vector<4xi64>) -> vector<4xi64> {
+  // expected-error at +1 {{failed to legalize operation 'arith.extsi' that was explicitly marked illegal}}
+  %0 = arith.extsi %arg0: vector<4xi64> to vector<4xi128>
+  %2 = arith.muli %0, %0 : vector<4xi128>
+  %3 = arith.trunci %2 : vector<4xi128> to vector<4xi64>
+  return %3 : vector<4xi64>
+}
+
+// -----
+
+// Unsupported function return type.
+// expected-error at +1 {{failed to legalize operation 'func.func' that was explicitly marked illegal}}
+func.func @unsupported_return_type(%arg0: vector<4xi64>) -> vector<4xi128> {
+  %0 = arith.extsi %arg0: vector<4xi64> to vector<4xi128>
+  return %0 : vector<4xi128>
+}
+
+// -----
+
+// Unsupported function argument type.
+// expected-error at +1 {{failed to legalize operation 'func.func' that was explicitly marked illegal}}
+func.func @unsupported_return_type(%arg0: vector<4xi128>) -> vector<4xi64> {
+  %0 = arith.trunci %arg0: vector<4xi128> to vector<4xi64>
+  return %0 : vector<4xi64>
+}
+



More information about the Mlir-commits mailing list