[Mlir-commits] [mlir] bb1f220 - [mlir][tosa] Fix negate lowering to skip no-op casts (#173299)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Jan 5 01:11:45 PST 2026
Author: Vitalii Shutov
Date: 2026-01-05T09:11:40Z
New Revision: bb1f220d534b0f6d80bea36662f5188ff11c2e54
URL: https://github.com/llvm/llvm-project/commit/bb1f220d534b0f6d80bea36662f5188ff11c2e54
DIFF: https://github.com/llvm/llvm-project/commit/bb1f220d534b0f6d80bea36662f5188ff11c2e54.diff
LOG: [mlir][tosa] Fix negate lowering to skip no-op casts (#173299)
Fix TOSA negate lowering to avoid emitting same-width
`ExtSIOp`/`TruncIOp`, which the arith verifier now rejects. Behavior is
unchanged. We only skip no-op casts when operand and intermediate widths
already match. Adds a regression test ensuring the lowering for integer
negates doesn't produce verifier-invalid casts.
Added:
Modified:
mlir/lib/Conversion/TosaToLinalg/TosaToLinalg.cpp
mlir/test/Conversion/TosaToLinalg/tosa-to-linalg.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Conversion/TosaToLinalg/TosaToLinalg.cpp b/mlir/lib/Conversion/TosaToLinalg/TosaToLinalg.cpp
index 99b5a2cb0a501..6db924dd090c8 100644
--- a/mlir/lib/Conversion/TosaToLinalg/TosaToLinalg.cpp
+++ b/mlir/lib/Conversion/TosaToLinalg/TosaToLinalg.cpp
@@ -226,18 +226,22 @@ static Value createLinalgBodyCalculationForElementwiseOp(
rewriter, loc, rewriter.getIntegerAttr(intermediateType, zpAdd));
} else {
intermediateType = rewriter.getIntegerType(intermediateBitWidth);
- auto arg1 =
- arith::ExtSIOp::create(rewriter, loc, intermediateType, args[1]);
- auto arg2 =
- arith::ExtSIOp::create(rewriter, loc, intermediateType, args[2]);
+ Value arg1 = args[1];
+ Value arg2 = args[2];
+ // Avoid verifier-invalid no-op sign-extends; only widen when needed.
+ if (arg1.getType() != intermediateType)
+ arg1 = arith::ExtSIOp::create(rewriter, loc, intermediateType, arg1);
+ if (arg2.getType() != intermediateType)
+ arg2 = arith::ExtSIOp::create(rewriter, loc, intermediateType, arg2);
zpAddValue =
arith::AddIOp::create(rewriter, loc, intermediateType, arg1, arg2);
}
// The negation can be applied by doing:
// outputValue = inZp + outZp - inputValue
- auto ext =
- arith::ExtSIOp::create(rewriter, loc, intermediateType, args[0]);
+ Value ext = args[0];
+ if (ext.getType() != intermediateType)
+ ext = arith::ExtSIOp::create(rewriter, loc, intermediateType, ext);
auto sub = arith::SubIOp::create(rewriter, loc, zpAddValue, ext);
// Clamp to the negation range.
@@ -249,7 +253,9 @@ static Value createLinalgBodyCalculationForElementwiseOp(
APInt::getSignedMaxValue(inputBitWidth).getSExtValue());
auto clamp = clampIntHelper(loc, sub, min, max, rewriter, false);
- // Truncate to the final value.
+ // Truncate to the final value, skipping no-op trunci when widths match.
+ if (clamp.getType() == elementTy)
+ return clamp;
return arith::TruncIOp::create(rewriter, loc, elementTy, clamp);
}
}
diff --git a/mlir/test/Conversion/TosaToLinalg/tosa-to-linalg.mlir b/mlir/test/Conversion/TosaToLinalg/tosa-to-linalg.mlir
index e84ed80f173b0..e6bd800a0cf0a 100644
--- a/mlir/test/Conversion/TosaToLinalg/tosa-to-linalg.mlir
+++ b/mlir/test/Conversion/TosaToLinalg/tosa-to-linalg.mlir
@@ -2645,3 +2645,13 @@ func.func @mul_no_const_shift(%arg0: tensor<2x3xi32>, %arg1: tensor<2x3xi32>, %a
%0 = tosa.mul %arg0, %arg1, %arg2 : (tensor<2x3xi32>, tensor<2x3xi32>, tensor<1xi8>) -> tensor<2x3xi32>
return %0 : tensor<2x3xi32>
}
+// -----
+
+// CHECK-LABEL: @negate_i64_no_noop_cast
+// CHECK: linalg.generic
+// CHECK-NOT: arith.extsi {{.*}} : i64 to i64
+// CHECK-NOT: arith.trunci {{.*}} : i64 to i64
+func.func @negate_i64_no_noop_cast(%arg0: tensor<4xi64>, %in_zp: tensor<1xi64>, %out_zp: tensor<1xi64>) -> tensor<4xi64> {
+ %neg = tosa.negate %arg0, %in_zp, %out_zp : (tensor<4xi64>, tensor<1xi64>, tensor<1xi64>) -> tensor<4xi64>
+ return %neg : tensor<4xi64>
+}
More information about the Mlir-commits
mailing list