diff --git a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp --- a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp +++ b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp @@ -336,8 +336,11 @@ // The dim op is also okay if its operand memref is a view/subview whose // corresponding size is a valid symbol. std::optional index = getConstantIntValue(dimOp.getDimension()); - assert(index.has_value() && - "expect only `dim` operations with a constant index"); + + // Be conservative if we can't understand the dimension. + if (!index.has_value()) + return false; + int64_t i = index.value(); return TypeSwitch(dimOp.getShapedValue().getDefiningOp()) .Case( diff --git a/mlir/test/Dialect/Affine/invalid.mlir b/mlir/test/Dialect/Affine/invalid.mlir --- a/mlir/test/Dialect/Affine/invalid.mlir +++ b/mlir/test/Dialect/Affine/invalid.mlir @@ -501,3 +501,17 @@ affine.delinearize_index %idx into () : index return } + +// ----- + +func.func @dynamic_dimension_index() { + "unknown.region"() ({ + %idx = "unknown.test"() : () -> (index) + %memref = "unknown.test"() : () -> memref + %dim = memref.dim %memref, %idx : memref + // expected-error @below {{op index must be a dimension or symbol identifier}} + affine.load %memref[%dim, %dim] : memref + "unknown.terminator"() : () -> () + }) : () -> () + return +}