[llvm] [LoopUnroll] Structural cost savings analysis for full loop unrolling (PR #114579)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 20 04:58:37 PST 2024
================
@@ -833,34 +1063,54 @@ shouldPragmaUnroll(Loop *L, const PragmaInfo &PInfo,
return std::nullopt;
}
-static std::optional<unsigned> shouldFullUnroll(
- Loop *L, const TargetTransformInfo &TTI, DominatorTree &DT,
- ScalarEvolution &SE, const SmallPtrSetImpl<const Value *> &EphValues,
- const unsigned FullUnrollTripCount, const UnrollCostEstimator UCE,
- const TargetTransformInfo::UnrollingPreferences &UP) {
- assert(FullUnrollTripCount && "should be non-zero!");
+static bool
+shouldFullUnroll(Loop *L, const TargetTransformInfo &TTI, DominatorTree &DT,
+ ScalarEvolution &SE,
+ const SmallPtrSetImpl<const Value *> &EphValues,
+ const UnrollCostEstimator UCE,
+ const TargetTransformInfo::UnrollingPreferences &UP) {
+ assert(UP.Count && "should be non-zero!");
- if (FullUnrollTripCount > UP.FullUnrollMaxCount)
- return std::nullopt;
+ if (UP.Count > UP.FullUnrollMaxCount)
+ return false;
// When computing the unrolled size, note that BEInsns are not replicated
// like the rest of the loop body.
if (UCE.getUnrolledLoopSize(UP) < UP.Threshold)
- return FullUnrollTripCount;
+ return true;
// The loop isn't that small, but we still can fully unroll it if that
- // helps to remove a significant number of instructions.
- // To check that, run additional analysis on the loop.
+ // helps to remove a significant number of instructions. To check that, run
+ // additional analyses on the loop. First try a full iteration-by-iteration
+ // analysis on the loop. If that fails, run a simpler structural analysis that
+ // estimates per-iteration cost savings in the unrolled loop.
if (std::optional<EstimatedUnrollCost> Cost = analyzeLoopUnrollCost(
- L, FullUnrollTripCount, DT, SE, EphValues, TTI,
+ L, UP.Count, DT, SE, EphValues, TTI,
UP.Threshold * UP.MaxPercentThresholdBoost / 100,
UP.MaxIterationsCountToAnalyze)) {
unsigned Boost =
- getFullUnrollBoostingFactor(*Cost, UP.MaxPercentThresholdBoost);
+ getFullUnrollBoostingFactor(*Cost, UP.MaxPercentThresholdBoost);
if (Cost->UnrolledCost < UP.Threshold * Boost / 100)
- return FullUnrollTripCount;
+ return true;
+ } else {
+ InstructionCost Savings = analyzeFullUnrollCostSavings(L, SE, TTI, UP);
+ if (!(Savings.isValid() && *Savings.getValue()))
+ return false;
----------------
arsenm wrote:
```suggestion
if (!Savings.isValid() || !*Savings.getValue())
return false;
```
https://github.com/llvm/llvm-project/pull/114579
More information about the llvm-commits
mailing list