[Mlir-commits] [mlir] [mlir][tosa] Disallow boolean as element type for Clamp (PR #149312)
Longsheng Mou
llvmlistbot at llvm.org
Mon Jul 21 05:11:30 PDT 2025
https://github.com/CoTinker updated https://github.com/llvm/llvm-project/pull/149312
>From 0d1fd28c0ec7b8b80b3d7f7c1380654ec39198f5 Mon Sep 17 00:00:00 2001
From: Longsheng Mou <longshengmou at gmail.com>
Date: Thu, 17 Jul 2025 21:40:31 +0800
Subject: [PATCH] [mlir][tosa] Interpret boolean values correctly
Previously the `ClampOp::verify` would sign extend boolean values, leading "true" to be casted to a value of -1 instead of 1. This PR ensures i1 values are zero extended, since i1 is used as a boolean value in TOSA.
---
mlir/lib/Dialect/Tosa/IR/TosaOps.cpp | 5 +++--
mlir/test/Dialect/Tosa/invalid.mlir | 9 +++++++++
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/mlir/lib/Dialect/Tosa/IR/TosaOps.cpp b/mlir/lib/Dialect/Tosa/IR/TosaOps.cpp
index f0ff430bae882..1f03fca907e29 100644
--- a/mlir/lib/Dialect/Tosa/IR/TosaOps.cpp
+++ b/mlir/lib/Dialect/Tosa/IR/TosaOps.cpp
@@ -945,10 +945,11 @@ LogicalResult tosa::ClampOp::verify() {
return emitOpError("min/max attributes types are incompatible with "
"input/output element types.");
- const bool isUnsigned = cast<IntegerType>(inputETy).isUnsigned();
+ const bool isUnsigned = inputETy.isUnsignedInteger();
+ const bool isBoolean = inputETy.isInteger(1);
const APInt minVal = intMinValAttr.getValue();
const APInt maxVal = intMaxValAttr.getValue();
- if (isUnsigned ? maxVal.ult(minVal) : maxVal.slt(minVal))
+ if ((isUnsigned || isBoolean) ? maxVal.ult(minVal) : maxVal.slt(minVal))
return emitOpError("expected min_val <= max_val, got min_val=")
<< minValAttr << ", max_val=" << maxValAttr;
} else {
diff --git a/mlir/test/Dialect/Tosa/invalid.mlir b/mlir/test/Dialect/Tosa/invalid.mlir
index 5a424c41775c9..ed747145369d7 100644
--- a/mlir/test/Dialect/Tosa/invalid.mlir
+++ b/mlir/test/Dialect/Tosa/invalid.mlir
@@ -750,6 +750,15 @@ func.func @test_mismatch_in_out_shape_clamp(%arg0: tensor<13x21x3xf32>) -> tenso
// -----
+// CHECK-LABEL: test_unsupported_boolean_type_clamp
+func.func @test_unsupported_boolean_type_clamp(%arg0: tensor<13x21x3xi1>) -> tensor<13x21x3xi1> {
+ // expected-error at +1 {{'tosa.clamp' op illegal: operation operand/result data types did not align with any profile or extension, got (i1,i1), did you mean (i8,i8)?}}
+ %0 = tosa.clamp %arg0 {min_val = false, max_val = true} : (tensor<13x21x3xi1>) -> tensor<13x21x3xi1>
+ return %0 : tensor<13x21x3xi1>
+}
+
+// -----
+
// CHECK-LABEL: test_mismatch_in_out_data_type_erf
func.func @test_mismatch_in_out_data_type_erf(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf16> {
// expected-error at +1 {{'tosa.erf' op requires the same element type for all operands and results}}
More information about the Mlir-commits
mailing list