[Mlir-commits] [mlir] [mlir][SCF] Add support for peeling the first iteration out of the loop (PR #74015)
Lei Zhang
llvmlistbot at llvm.org
Fri Dec 8 22:07:34 PST 2023
================
@@ -205,32 +222,84 @@ LogicalResult mlir::scf::peelForLoopAndSimplifyBounds(RewriterBase &rewriter,
return success();
}
+LogicalResult mlir::scf::peelFirstIterationForLoop(RewriterBase &b, ForOp forOp,
+ ForOp &firstIteration) {
+ RewriterBase::InsertionGuard guard(b);
+ auto lbInt = getConstantIntValue(forOp.getLowerBound());
+ auto ubInt = getConstantIntValue(forOp.getUpperBound());
+ auto stepInt = getConstantIntValue(forOp.getStep());
+
+ // Peeling is not needed if there is one or less iteration.
+ if (lbInt && ubInt && stepInt && (*ubInt - *lbInt) / *stepInt <= 1)
+ return success();
+
+ AffineExpr sym0, sym1, sym2;
+ bindSymbols(b.getContext(), sym0, sym1, sym2);
+ SmallVector<Value> operands{forOp.getLowerBound(), forOp.getUpperBound(),
+ forOp.getStep()};
+
+ // New lower bound for main loop: %lb + %step
+ auto ubMap = AffineMap::get(0, 2, {sym0 + sym1});
+ b.setInsertionPoint(forOp);
+ auto loc = forOp.getLoc();
+ Value splitBound = b.createOrFold<AffineApplyOp>(
+ loc, ubMap, ValueRange{forOp.getLowerBound(), forOp.getStep()});
+
+ // Peel the first iteration.
+ b.setInsertionPoint(forOp);
+ firstIteration = cast<ForOp>(b.clone(*forOp.getOperation()));
+ firstIteration.getUpperBoundMutable().assign(splitBound);
+
+ // Update main loop with new lower bound.
+ forOp.getInitArgsMutable().assign(firstIteration->getResults());
----------------
antiagainst wrote:
Put this in the `updateRootInPlace` too?
https://github.com/llvm/llvm-project/pull/74015
More information about the Mlir-commits
mailing list