[Mlir-commits] [mlir] [mlir][scf] Add parallelLoopUnrollByFactors() (PR #163806)
Andrzej WarzyĆski
llvmlistbot at llvm.org
Wed Oct 22 11:50:50 PDT 2025
================
@@ -1544,3 +1558,107 @@ bool mlir::isPerfectlyNestedForLoops(
}
return true;
}
+
+std::optional<llvm::APSInt> mlir::scf::computeUbMinusLb(Value lb, Value ub,
+ bool isSigned) {
+ llvm::APSInt diff;
+ auto addOp = ub.getDefiningOp<arith::AddIOp>();
+ if (!addOp)
+ return std::nullopt;
+ if ((isSigned && !addOp.hasNoSignedWrap()) ||
+ (!isSigned && !addOp.hasNoUnsignedWrap()))
+ return std::nullopt;
+
+ if (addOp.getLhs() != lb ||
+ !matchPattern(addOp.getRhs(), m_ConstantInt(&diff)))
+ return std::nullopt;
+ return diff;
+}
+
+llvm::SmallVector<int64_t>
+getConstLoopTripCounts(mlir::LoopLikeOpInterface loopOp) {
+ auto loBnds = loopOp.getLoopLowerBounds();
+ auto upBnds = loopOp.getLoopUpperBounds();
+ auto steps = loopOp.getLoopSteps();
+ if (!loBnds || !upBnds || !steps)
+ return {};
+ llvm::SmallVector<int64_t> tripCounts;
+ for (auto [lb, ub, step] : llvm::zip(*loBnds, *upBnds, *steps)) {
+ std::optional<llvm::APInt> numIter = constantTripCount(
+ lb, ub, step, /*isSigned=*/true, scf::computeUbMinusLb);
+ if (!numIter)
+ return {};
+ tripCounts.push_back(numIter->getSExtValue());
+ }
+ return tripCounts;
+}
+
+FailureOr<scf::ParallelOp> mlir::parallelLoopUnrollByFactors(
+ scf::ParallelOp op, ArrayRef<uint64_t> unrollFactors,
+ RewriterBase &rewriter,
+ function_ref<void(unsigned, Operation *, OpBuilder)> annotateFn,
+ IRMapping *clonedToSrcOpsMap) {
+ const unsigned numLoops = op.getNumLoops();
+
+ // bail out if no valid unroll factors were provided
+ if (unrollFactors.empty() ||
+ llvm::any_of(unrollFactors, [](uint64_t f) { return f == 0; }) ||
+ llvm::all_of(unrollFactors, [](uint64_t f) { return f == 1; }) ||
+ (unrollFactors.size() > numLoops))
+ return failure();
----------------
banach-space wrote:
This method should be consistent with `loopUnrollByFactor`. So, for example, it should assert that the unroll factors are != 0: https://github.com/llvm/llvm-project/blob/154138c25f358ed812eafc2880225c3d88221e8a/mlir/lib/Dialect/SCF/Utils/Utils.cpp#L356
Unroll factor == 1 should work. If there's a reason for it not working, that's fine, but lets document that :)
Ah, from what I can tell, this should also be an assert: `!unrollFactors.empty()`.
Btw, could you replace `railure()` with `notifyMatchFailure` and some helpful diagnostic?
https://github.com/llvm/llvm-project/pull/163806
More information about the Mlir-commits
mailing list