[Mlir-commits] [mlir] [mlir][arith] Fix crash when narrowing or truncating to i0 (PR #179894)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Feb 5 01:24:58 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir
Author: Shoaib Khan (shoaibkhan-sde)
<details>
<summary>Changes</summary>
"The arith-int-range-narrowing pass was causing a crash when encountering a truncation to a zero-bitwidth integer (i0). This was due to an assertion failure in APInt during range inference."
"This PR adds guards in IntRangeOptimizations.cpp and InferIntRangeInterfaceImpls.cpp to safely skip processing when the target bitwidth is zero."
---
Full diff: https://github.com/llvm/llvm-project/pull/179894.diff
2 Files Affected:
- (modified) mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp (+5)
- (modified) mlir/lib/Dialect/Arith/Transforms/IntRangeOptimizations.cpp (+3)
``````````diff
diff --git a/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp b/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
index 49f89e1bd17f3..900d986e79c9a 100644
--- a/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
+++ b/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
@@ -245,6 +245,11 @@ void arith::TruncIOp::inferResultRanges(ArrayRef<ConstantIntRanges> argRanges,
SetIntRangeFn setResultRange) {
unsigned destWidth =
ConstantIntRanges::getStorageBitwidth(getResult().getType());
+
+ // Shoaib's Ultimate Guard: If width is 0, don't calculate ranges.
+ if (destWidth == 0)
+ return;
+
setResultRange(getResult(), truncRange(argRanges[0], destWidth));
}
diff --git a/mlir/lib/Dialect/Arith/Transforms/IntRangeOptimizations.cpp b/mlir/lib/Dialect/Arith/Transforms/IntRangeOptimizations.cpp
index fefbba989b996..bad12c0a010f0 100644
--- a/mlir/lib/Dialect/Arith/Transforms/IntRangeOptimizations.cpp
+++ b/mlir/lib/Dialect/Arith/Transforms/IntRangeOptimizations.cpp
@@ -347,6 +347,9 @@ struct NarrowElementwise final : OpTraitRewritePattern<OpTrait::Elementwise> {
op, "no operands or operand types don't match result type");
for (unsigned targetBitwidth : targetBitwidths) {
+ // Shoaib's Fix: Bitwidth must be at least 1 to be valid in MLIR.
+ if (targetBitwidth == 0)
+ continue;
CastKind castKind = CastKind::Both;
for (const ConstantIntRanges &range : ranges) {
castKind = mergeCastKinds(castKind,
``````````
</details>
https://github.com/llvm/llvm-project/pull/179894
More information about the Mlir-commits
mailing list