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(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@+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@+1 {{'tosa.erf' op requires the same element type for all operands and results}}