@@ -112,6 +112,8 @@ static OpFoldResult getBoundedTileSize(OpBuilder &b, Location loc,
112
112
// / - `resultSizes` is of the same size as `tiledValues` and represents
113
113
// / the size of the corresponding element from `tiledValues` inserted into
114
114
// / the element from `newBbArgs`.
115
+ // / In case the method needs to return `failure()` the method is expected
116
+ // / to clean up any inserted operations.
115
117
using YieldTiledValuesFn = std::function<LogicalResult(
116
118
RewriterBase &rewriter, Location loc, ValueRange ivs, ValueRange newBbArgs,
117
119
SmallVector<Value> &tiledValues,
@@ -354,17 +356,10 @@ FailureOr<LoopLikeOpInterface> yieldTiledValuesAndReplaceLoop<scf::ForOp>(
354
356
if (failed (yieldTiledValuesFn (rewriter, loc, newLoop.getInductionVar (),
355
357
newRegionIterArgs, tiledValues, resultOffsets,
356
358
resultSizes))) {
359
+ rewriter.eraseOp (newLoop);
357
360
return rewriter.notifyMatchFailure (loopOp, " failed to get tiled values" );
358
361
}
359
362
360
- if (tiledValues.size () != resultOffsets.size () ||
361
- tiledValues.size () != resultSizes.size ()) {
362
- return rewriter.notifyMatchFailure (
363
- loopOp,
364
- " expected number of tiled values returned, the number of offset "
365
- " vectors and number of size vectors to be the same" );
366
- }
367
-
368
363
SmallVector<Value> newYieldValues = llvm::to_vector (yieldOp.getOperands ());
369
364
for (auto [tiledValue, regionIterArg, resultOffset, resultSize] :
370
365
llvm::zip_equal (tiledValues, newRegionIterArgs, resultOffsets,
@@ -414,6 +409,7 @@ FailureOr<LoopLikeOpInterface> yieldTiledValuesAndReplaceLoop<scf::ForallOp>(
414
409
if (failed (yieldTiledValuesFn (rewriter, loc, newLoop.getInductionVars (),
415
410
regionIterArgs, tiledValues, resultOffsets,
416
411
resultSizes))) {
412
+ rewriter.eraseOp (newLoop);
417
413
return rewriter.notifyMatchFailure (loopOp,
418
414
" failed to get yielded tiled values" );
419
415
}
@@ -625,8 +621,10 @@ mlir::scf::tileUsingSCF(RewriterBase &rewriter, TilingInterface op,
625
621
626
622
// 5c. Tile the cloned operation.
627
623
tilingResult = clonedOp.getTiledImplementation (rewriter, offsets, sizes);
628
- if (failed (tilingResult))
629
- return op.emitOpError (" failed to tile operation" );
624
+ if (failed (tilingResult)) {
625
+ rewriter.eraseOp (clonedOp);
626
+ return op.emitOpError (" faild to tile operation" );
627
+ }
630
628
631
629
// 5d. Delete the cloned operation.
632
630
rewriter.eraseOp (clonedOp);
@@ -639,6 +637,9 @@ mlir::scf::tileUsingSCF(RewriterBase &rewriter, TilingInterface op,
639
637
SmallVector<OpFoldResult> resultOffset, resultSize;
640
638
if (failed (op.getResultTilePosition (rewriter, index, offsets, sizes,
641
639
resultOffset, resultSize))) {
640
+ for (auto op : tilingResult->tiledOps ) {
641
+ rewriter.eraseOp (op);
642
+ }
642
643
return rewriter.notifyMatchFailure (
643
644
op, " failed to get slice of result produced" );
644
645
}
0 commit comments