[Mlir-commits] [mlir] [mlir][arith] Fix crash when narrowing or truncating to i0 (PR #179894)

Shoaib Khan llvmlistbot at llvm.org
Thu Feb 5 01:24:07 PST 2026


https://github.com/shoaibkhan-sde created https://github.com/llvm/llvm-project/pull/179894

"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."

>From 097b6567ca549c244a18f4cce0b005244b17f67e Mon Sep 17 00:00:00 2001
From: shoaibkhan-sde <shoaib.cse.engineer at gmail.com>
Date: Thu, 5 Feb 2026 14:41:50 +0530
Subject: [PATCH] [mlir][arith] Fix crash when narrowing/truncating to i0

Added guards to prevent integer range inference and narrowing patterns from processing zero-bitwidth types, which previously caused an APInt shift assertion failure.
---
 mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp   | 5 +++++
 mlir/lib/Dialect/Arith/Transforms/IntRangeOptimizations.cpp | 3 +++
 2 files changed, 8 insertions(+)

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,



More information about the Mlir-commits mailing list