[Mlir-commits] [mlir] e6668b1 - [mlir][tosa] Use roundeven in TOSA cast splat constant op folding (#99484)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Jul 19 00:22:43 PDT 2024
Author: Corentin Ferry
Date: 2024-07-19T09:22:39+02:00
New Revision: e6668b1be8acbabeea0704bdc224637059aaa2af
URL: https://github.com/llvm/llvm-project/commit/e6668b1be8acbabeea0704bdc224637059aaa2af
DIFF: https://github.com/llvm/llvm-project/commit/e6668b1be8acbabeea0704bdc224637059aaa2af.diff
LOG: [mlir][tosa] Use roundeven in TOSA cast splat constant op folding (#99484)
The behavior of TOSA Cast operation for floating-point to integers is to round to the nearest even. This commit aligns the behavior of folding a TOSA Cast of a float splat to int, so it also uses roundeven.
Added:
Modified:
mlir/lib/Dialect/Tosa/IR/TosaCanonicalizations.cpp
mlir/test/Dialect/Tosa/constant-op-fold.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Dialect/Tosa/IR/TosaCanonicalizations.cpp b/mlir/lib/Dialect/Tosa/IR/TosaCanonicalizations.cpp
index 866ab0d2228f7..da9a93feac4d6 100644
--- a/mlir/lib/Dialect/Tosa/IR/TosaCanonicalizations.cpp
+++ b/mlir/lib/Dialect/Tosa/IR/TosaCanonicalizations.cpp
@@ -764,7 +764,8 @@ OpFoldResult CastOp::fold(FoldAdaptor adaptor) {
llvm::cast<IntegerType>(outETy).getIntOrFloatBitWidth(), unsign);
auto floatVal = operand.getSplatValue<APFloat>();
bool exact;
- floatVal.convertToInteger(intVal, llvm::RoundingMode::TowardZero, &exact);
+ floatVal.convertToInteger(intVal, llvm::RoundingMode::NearestTiesToEven,
+ &exact);
return SplatElementsAttr::get(outTy, intVal);
}
diff --git a/mlir/test/Dialect/Tosa/constant-op-fold.mlir b/mlir/test/Dialect/Tosa/constant-op-fold.mlir
index ad82c9f8858e6..8e19f87dbf4aa 100644
--- a/mlir/test/Dialect/Tosa/constant-op-fold.mlir
+++ b/mlir/test/Dialect/Tosa/constant-op-fold.mlir
@@ -566,6 +566,17 @@ func.func @cast_float_to_int() -> tensor<i16> {
// -----
+// CHECK: func.func @cast_float_to_int_round
+func.func @cast_float_to_int_round() -> tensor<i16> {
+ %splat = "tosa.const"() {value = dense<-3.5> : tensor<f32>} : () -> tensor<f32>
+ // CHECK: %[[SPLAT:.+]] = "tosa.const"() <{value = dense<-4> : tensor<i16>}
+ %cast = tosa.cast %splat : (tensor<f32>) -> tensor<i16>
+ // CHECK: return %[[SPLAT]]
+ return %cast : tensor<i16>
+}
+
+// -----
+
// CHECK: func.func @cast_int_to_int_trunc
func.func @cast_int_to_int_trunc() -> tensor<i16> {
%splat = "tosa.const"() {value = dense<-1> : tensor<i32>} : () -> tensor<i32>
More information about the Mlir-commits
mailing list