[Mlir-commits] [mlir] [mlir][affine] Use value bound inference to determine minimum/maximum trip counts in loop analysis (PR #128113)
lonely eagle
llvmlistbot at llvm.org
Tue Apr 8 20:49:56 PDT 2025
================
@@ -212,6 +214,40 @@ void mlir::affine::getTripCountMapAndOperands(
tripCountValueMap.getOperands().end());
}
+/// Take the min if all trip counts are constant.
+static std::optional<uint64_t>
+getKnownTripCountBound(AffineMap map, SmallVectorImpl<Value> &operands,
+ presburger::BoundType type) {
+ std::optional<uint64_t> tripCount;
+ for (auto resultExpr : map.getResults()) {
+ AffineMap subMap =
+ AffineMap::get(map.getNumDims(), map.getNumSymbols(), resultExpr);
+ ValueBoundsConstraintSet::Variable var(subMap, operands);
+ auto lbBound = ValueBoundsConstraintSet::computeConstantBound(
+ mlir::presburger::BoundType::LB, var);
+ auto ubBound = ValueBoundsConstraintSet::computeConstantBound(
+ mlir::presburger::BoundType::UB, var, nullptr, true);
+ if (failed(lbBound) || failed(ubBound))
+ return std::nullopt;
+ if (type == presburger::BoundType::LB) {
+ if (tripCount.has_value())
+ tripCount =
+ std::min(*tripCount, static_cast<uint64_t>(lbBound.value()));
+ else
+ tripCount = lbBound.value();
+ } else if (type == presburger::BoundType::UB) {
+ if (tripCount.has_value())
+ tripCount =
+ std::min(*tripCount, static_cast<uint64_t>(ubBound.value()));
----------------
linuxlonelyeagle wrote:
Thanks for pointing this out, I think using `std::max` is more appropriate here.
https://github.com/llvm/llvm-project/pull/128113
More information about the Mlir-commits
mailing list