[Mlir-commits] [mlir] 5480fc6 - [mlir][tosa] Interpret boolean values correctly in cast folder (#147078)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Tue Jul 15 23:33:44 PDT 2025
Author: Luke Hutton
Date: 2025-07-16T07:33:40+01:00
New Revision: 5480fc6bb8ef6a6a895be7952d50d557116dcb38
URL: https://github.com/llvm/llvm-project/commit/5480fc6bb8ef6a6a895be7952d50d557116dcb38
DIFF: https://github.com/llvm/llvm-project/commit/5480fc6bb8ef6a6a895be7952d50d557116dcb38.diff
LOG: [mlir][tosa] Interpret boolean values correctly in cast folder (#147078)
Previously the cast folder would sign extend boolean values, leading
"true" to be casted to a value of -1 instead of 1. This change ensures
i1 values are zero extended, since i1 is used as a boolean value in
TOSA. According to the TOSA spec, the result of a boolean cast with
value "true" to another integer type should give a result of 1.
Fixes https://github.com/llvm/llvm-project/issues/57951
Added:
Modified:
mlir/lib/Dialect/Tosa/IR/TosaCanonicalizations.cpp
mlir/test/Dialect/Tosa/canonicalize.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Dialect/Tosa/IR/TosaCanonicalizations.cpp b/mlir/lib/Dialect/Tosa/IR/TosaCanonicalizations.cpp
index 2dd45d27157cb..5758d8d5ef506 100644
--- a/mlir/lib/Dialect/Tosa/IR/TosaCanonicalizations.cpp
+++ b/mlir/lib/Dialect/Tosa/IR/TosaCanonicalizations.cpp
@@ -1295,7 +1295,8 @@ OpFoldResult CastOp::fold(FoldAdaptor adaptor) {
}
if (llvm::isa<IntegerType>(inETy) && llvm::isa<IntegerType>(outETy)) {
- auto unsignIn = llvm::cast<IntegerType>(inETy).isUnsignedInteger();
+ const auto inIntType = llvm::cast<IntegerType>(inETy);
+ auto unsignIn = inIntType.isUnsignedInteger();
bool trunc =
inETy.getIntOrFloatBitWidth() > outETy.getIntOrFloatBitWidth();
auto intVal = operand.getSplatValue<APInt>();
@@ -1303,7 +1304,8 @@ OpFoldResult CastOp::fold(FoldAdaptor adaptor) {
if (trunc) {
intVal = intVal.trunc(bitwidth);
- } else if (unsignIn) {
+ // i1 types are boolean in TOSA
+ } else if (unsignIn || inIntType.isInteger(1)) {
intVal = intVal.zext(bitwidth);
} else {
intVal = intVal.sext(bitwidth);
diff --git a/mlir/test/Dialect/Tosa/canonicalize.mlir b/mlir/test/Dialect/Tosa/canonicalize.mlir
index 27280807b0282..11c8d54fda055 100644
--- a/mlir/test/Dialect/Tosa/canonicalize.mlir
+++ b/mlir/test/Dialect/Tosa/canonicalize.mlir
@@ -1338,3 +1338,14 @@ func.func @no_fold_mul_result_exceeds_i32() -> tensor<i32> {
%3 = tosa.mul %0, %1, %2 : (tensor<i32>, tensor<i32>, tensor<1xi8>) -> tensor<i32>
return %3 : tensor<i32>
}
+
+// -----
+
+// CHECK-LABEL: @test_fold_i1_to_i32_cast
+// CHECK: %[[OUT:.*]] = "tosa.const"() <{values = dense<1> : tensor<i32>}> : () -> tensor<i32>
+// CHECK: return %[[OUT]] : tensor<i32>
+func.func @test_fold_i1_to_i32_cast() -> tensor<i32> {
+ %0 = "tosa.const"() <{values = dense<1> : tensor<i1>}> : () -> tensor<i1>
+ %1 = "tosa.cast"(%0) : (tensor<i1>) -> tensor<i32>
+ return %1 : tensor<i32>
+}
More information about the Mlir-commits
mailing list