Skip to content

Commit

Permalink
[mlir][arith] Fix type conversion in emulate-wide-int
Browse files Browse the repository at this point in the history
Use `nullptr` to indicate that type conversion failed and no fallback
conversion should be attempted.

Fixes: llvm#108163
  • Loading branch information
kuhar committed Oct 12, 2024
1 parent 6a6af02 commit a6da7e8
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 4 deletions.
8 changes: 4 additions & 4 deletions mlir/lib/Dialect/Arith/Transforms/EmulateWideInt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -1102,7 +1102,7 @@ arith::WideIntEmulationConverter::WideIntEmulationConverter(
IntegerType::get(ty.getContext(), maxIntWidth));
}

return std::nullopt;
return nullptr;
});

// Function case.
Expand All @@ -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);
});
Expand Down
43 changes: 43 additions & 0 deletions mlir/test/Dialect/Arith/emulate-wide-int-unsupported.mlir
Original file line number Diff line number Diff line change
@@ -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@+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@+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@+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@+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>
}

0 comments on commit a6da7e8

Please sign in to comment.