[Mlir-commits] [mlir] b8d2524 - [mlir][arith] Fix crash in ConstantOp range inference for zero-element constants (#204180)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Tue Jun 16 10:49:51 PDT 2026


Author: shubhamnarlawar
Date: 2026-06-16T13:49:47-04:00
New Revision: b8d2524025f38b052e75f82c222d5984f228e23e

URL: https://github.com/llvm/llvm-project/commit/b8d2524025f38b052e75f82c222d5984f228e23e
DIFF: https://github.com/llvm/llvm-project/commit/b8d2524025f38b052e75f82c222d5984f228e23e.diff

LOG: [mlir][arith] Fix crash in ConstantOp range inference for zero-element constants (#204180)

arith::ConstantOp::inferResultRanges computes the union of element
ranges by iterating a DenseIntElementsAttr. For a zero-element constant
(e.g. ) the loop body never runs,
leaving the std::optional result unset.

-> This fixes #202531

Added: 
    

Modified: 
    mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
    mlir/test/Dialect/Arith/int-range-narrowing.mlir

Removed: 
    


################################################################################
diff  --git a/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp b/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
index 49f89e1bd17f3..6e0269d1c92d8 100644
--- a/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
+++ b/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
@@ -41,6 +41,9 @@ void arith::ConstantOp::inferResultRanges(ArrayRef<ConstantIntRanges> argRanges,
   }
   if (auto arrayCstAttr =
           llvm::dyn_cast_or_null<DenseIntElementsAttr>(getValue())) {
+    if (arrayCstAttr.empty())
+      return;
+
     if (arrayCstAttr.isSplat()) {
       setResultRange(getResult(), ConstantIntRanges::constant(
                                       arrayCstAttr.getSplatValue<APInt>()));
@@ -53,7 +56,6 @@ void arith::ConstantOp::inferResultRanges(ArrayRef<ConstantIntRanges> argRanges,
       result = (result ? result->rangeUnion(range) : range);
     }
 
-    assert(result && "Zero-sized vectors are not allowed");
     setResultRange(getResult(), *result);
     return;
   }

diff  --git a/mlir/test/Dialect/Arith/int-range-narrowing.mlir b/mlir/test/Dialect/Arith/int-range-narrowing.mlir
index 7ba22af0c0f1b..5938f24868cb9 100644
--- a/mlir/test/Dialect/Arith/int-range-narrowing.mlir
+++ b/mlir/test/Dialect/Arith/int-range-narrowing.mlir
@@ -528,3 +528,11 @@ func.func @affine_for_dynamic_bound(%n: index) {
   }
   return
 }
+
+// Ensure a zero-element constant tensor doesn't crash range inference.
+// CHECK-LABEL: func @zero_element_tensor_constant
+func.func @zero_element_tensor_constant() -> tensor<2x0xi32> {
+  // CHECK: arith.constant dense<> : tensor<2x0xi32>
+  %0 = arith.constant dense<> : tensor<2x0xi32>
+  return %0 : tensor<2x0xi32>
+}


        


More information about the Mlir-commits mailing list