[Mlir-commits] [mlir] [mlir] Enable LICM for ops with only read side effects in scf.for (PR #120302)
Jakub Kuderski
llvmlistbot at llvm.org
Wed Jan 22 09:22:52 PST 2025
================
@@ -395,6 +396,40 @@ std::optional<SmallVector<OpFoldResult>> ForOp::getLoopUpperBounds() {
std::optional<ResultRange> ForOp::getLoopResults() { return getResults(); }
+/// Moves the op out of the loop with a guard that checks if the loop has at
+/// least one iteration.
+void ForOp::moveOutOfLoopWithGuard(Operation *op) {
+ IRRewriter rewriter(this->getContext());
+ OpBuilder::InsertionGuard insertGuard(rewriter);
+ rewriter.setInsertionPoint(this->getOperation());
+ Location loc = this->getLoc();
+ arith::CmpIOp cmpIOp = rewriter.create<arith::CmpIOp>(
+ loc, arith::CmpIPredicate::ult, this->getLowerBound(),
+ this->getUpperBound());
+ // Create the trip-count check.
+ scf::YieldOp thenYield;
+ scf::IfOp ifOp = rewriter.create<scf::IfOp>(
+ loc, cmpIOp,
+ [&](OpBuilder &builder, Location loc) {
+ thenYield = builder.create<scf::YieldOp>(loc, op->getResults());
+ },
+ [&](OpBuilder &builder, Location loc) {
+ SmallVector<Value> poisonResults;
+ poisonResults.reserve(op->getResults().size());
+ for (Type type : op->getResults().getTypes()) {
+ ub::PoisonOp poisonOp =
+ rewriter.create<ub::PoisonOp>(loc, type, nullptr);
+ poisonResults.push_back(poisonOp);
+ }
+ builder.create<scf::YieldOp>(loc, poisonResults);
+ });
+ for (auto [opResult, ifOpResult] :
+ llvm::zip(op->getResults(), ifOp->getResults()))
----------------
kuhar wrote:
Can we use `zip_equal`?
https://github.com/llvm/llvm-project/pull/120302
More information about the Mlir-commits
mailing list