diff --git a/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp b/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp index 72fb3308a2549..089ccc6680e48 100644 --- a/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp +++ b/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp @@ -2284,7 +2284,12 @@ LogicalResult IndexOp::verify() { } OpFoldResult IndexOp::fold(FoldAdaptor adaptor) { - auto linalgOp = cast((*this)->getParentOp()); + auto linalgOp = dyn_cast_or_null((*this)->getParentOp()); + // Bail out if `linalg.index` does not have a proper parent yet at this + // point, e.g., when calling `createOrFold` during IR construction in + // `genericOp::build`. + if (!linalgOp) + return OpFoldResult{}; // Index of unit dims is always 0. SmallVector loopBounds = linalgOp.getStaticLoopRanges();