Skip to content

Commit b462fee

Browse files
committed
Passing TTI through simplifyLoop so we can count instruction cost
1 parent ffae627 commit b462fee

File tree

16 files changed

+77
-66
lines changed

16 files changed

+77
-66
lines changed

llvm/include/llvm/Transforms/Utils/LoopConstrainer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#define LLVM_TRANSFORMS_UTILS_LOOP_CONSTRAINER_H
1111

1212
#include "llvm/Support/Casting.h"
13+
#include "llvm/Transforms/Utils/Local.h"
1314
#include "llvm/Transforms/Utils/ValueMapper.h"
1415
#include <optional>
1516

@@ -190,6 +191,7 @@ class LoopConstrainer {
190191
Function &F;
191192
LLVMContext &Ctx;
192193
ScalarEvolution &SE;
194+
TargetTransformInfo &TTI;
193195
DominatorTree &DT;
194196
LoopInfo &LI;
195197
function_ref<void(Loop *, bool)> LPMAddNewLoop;
@@ -216,7 +218,7 @@ class LoopConstrainer {
216218
LoopConstrainer(Loop &L, LoopInfo &LI,
217219
function_ref<void(Loop *, bool)> LPMAddNewLoop,
218220
const LoopStructure &LS, ScalarEvolution &SE,
219-
DominatorTree &DT, Type *T, SubRanges SR);
221+
TargetTransformInfo &TTI, DominatorTree &DT, Type *T, SubRanges SR);
220222

221223
// Entry point for the algorithm. Returns true on success.
222224
bool run();

llvm/include/llvm/Transforms/Utils/LoopPeel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ bool canPeelLastIteration(const Loop &L, ScalarEvolution &SE);
3131
/// off the last \p PeelCount iterations from \p L (canPeelLastIteration must be
3232
/// true for \p L), otherwise peel off the first \p PeelCount iterations.
3333
bool peelLoop(Loop *L, unsigned PeelCount, bool PeelLast, LoopInfo *LI,
34-
ScalarEvolution *SE, DominatorTree &DT, AssumptionCache *AC,
34+
ScalarEvolution *SE, const TargetTransformInfo *TTI, DominatorTree &DT, AssumptionCache *AC,
3535
bool PreserveLCSSA, ValueToValueMapTy &VMap);
3636

3737
TargetTransformInfo::PeelingPreferences

llvm/include/llvm/Transforms/Utils/LoopSimplify.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
#include "llvm/IR/PassManager.h"
4242
#include "llvm/Support/Compiler.h"
43+
#include "llvm/Transforms/Utils/Local.h"
4344

4445
namespace llvm {
4546

@@ -64,7 +65,7 @@ class LoopSimplifyPass : public PassInfoMixin<LoopSimplifyPass> {
6465
/// analyses if they're non-null, and LCSSA if \c PreserveLCSSA is true.
6566
LLVM_ABI bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI,
6667
ScalarEvolution *SE, AssumptionCache *AC,
67-
MemorySSAUpdater *MSSAU, bool PreserveLCSSA);
68+
MemorySSAUpdater *MSSAU, const TargetTransformInfo *TTI, bool PreserveLCSSA);
6869

6970
} // end namespace llvm
7071

llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ class InductiveRangeCheck {
234234
class InductiveRangeCheckElimination {
235235
ScalarEvolution &SE;
236236
BranchProbabilityInfo *BPI;
237+
TargetTransformInfo &TTI;
237238
DominatorTree &DT;
238239
LoopInfo &LI;
239240

@@ -248,9 +249,9 @@ class InductiveRangeCheckElimination {
248249

249250
public:
250251
InductiveRangeCheckElimination(ScalarEvolution &SE,
251-
BranchProbabilityInfo *BPI, DominatorTree &DT,
252+
BranchProbabilityInfo *BPI, TargetTransformInfo &TTI, DominatorTree &DT,
252253
LoopInfo &LI, GetBFIFunc GetBFI = std::nullopt)
253-
: SE(SE), BPI(BPI), DT(DT), LI(LI), GetBFI(GetBFI) {}
254+
: SE(SE), BPI(BPI), TTI(TTI), DT(DT), LI(LI), GetBFI(GetBFI) {}
254255

255256
bool run(Loop *L, function_ref<void(Loop *, bool)> LPMAddNewLoop);
256257
};
@@ -900,6 +901,7 @@ IntersectUnsignedRange(ScalarEvolution &SE,
900901

901902
PreservedAnalyses IRCEPass::run(Function &F, FunctionAnalysisManager &AM) {
902903
auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
904+
auto &TTI = AM.getResult<TargetIRAnalysis>(F);
903905
LoopInfo &LI = AM.getResult<LoopAnalysis>(F);
904906
// There are no loops in the function. Return before computing other expensive
905907
// analyses.
@@ -913,14 +915,14 @@ PreservedAnalyses IRCEPass::run(Function &F, FunctionAnalysisManager &AM) {
913915
auto getBFI = [&F, &AM ]()->BlockFrequencyInfo & {
914916
return AM.getResult<BlockFrequencyAnalysis>(F);
915917
};
916-
InductiveRangeCheckElimination IRCE(SE, &BPI, DT, LI, { getBFI });
918+
InductiveRangeCheckElimination IRCE(SE, &BPI, TTI, DT, LI, { getBFI });
917919

918920
bool Changed = false;
919921
{
920922
bool CFGChanged = false;
921923
for (const auto &L : LI) {
922924
CFGChanged |= simplifyLoop(L, &DT, &LI, &SE, nullptr, nullptr,
923-
/*PreserveLCSSA=*/false);
925+
&TTI, /*PreserveLCSSA=*/false);
924926
Changed |= formLCSSARecursively(*L, DT, &LI, &SE);
925927
}
926928
Changed |= CFGChanged;
@@ -1080,7 +1082,7 @@ bool InductiveRangeCheckElimination::run(
10801082
return false;
10811083
}
10821084

1083-
LoopConstrainer LC(*L, LI, LPMAddNewLoop, LS, SE, DT,
1085+
LoopConstrainer LC(*L, LI, LPMAddNewLoop, LS, SE, TTI, DT,
10841086
SafeIterRange->getBegin()->getType(), *MaybeSR);
10851087

10861088
if (LC.run()) {

llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ static BranchInst *findSplitCandidate(const Loop &L, ScalarEvolution &SE,
285285
}
286286

287287
static bool splitLoopBound(Loop &L, DominatorTree &DT, LoopInfo &LI,
288-
ScalarEvolution &SE, LPMUpdater &U) {
288+
ScalarEvolution &SE, LPMUpdater &U, const TargetTransformInfo *TTI) {
289289
ConditionInfo SplitCandidateCond;
290290
ConditionInfo ExitingCond;
291291

@@ -460,8 +460,8 @@ static bool splitLoopBound(Loop &L, DominatorTree &DT, LoopInfo &LI,
460460
SE.forgetLoop(&L);
461461

462462
// Canonicalize loops.
463-
simplifyLoop(&L, &DT, &LI, &SE, nullptr, nullptr, true);
464-
simplifyLoop(PostLoop, &DT, &LI, &SE, nullptr, nullptr, true);
463+
simplifyLoop(&L, &DT, &LI, &SE, nullptr, nullptr, TTI, true);
464+
simplifyLoop(PostLoop, &DT, &LI, &SE, nullptr, nullptr, TTI, true);
465465

466466
// Add new post-loop to loop pass manager.
467467
U.addSiblingLoops(PostLoop);
@@ -478,7 +478,9 @@ PreservedAnalyses LoopBoundSplitPass::run(Loop &L, LoopAnalysisManager &AM,
478478
LLVM_DEBUG(dbgs() << "Spliting bound of loop in " << F.getName() << ": " << L
479479
<< "\n");
480480

481-
if (!splitLoopBound(L, AR.DT, AR.LI, AR.SE, U))
481+
auto &FAM = AM.getResult<FunctionAnalysisManagerLoopProxy>(L, AR);
482+
auto TTI = FAM.getCachedResult<TargetIRAnalysis>(F);
483+
if (!splitLoopBound(L, AR.DT, AR.LI, AR.SE, U, TTI))
482484
return PreservedAnalyses::all();
483485

484486
assert(AR.DT.verify(DominatorTree::VerificationLevel::Fast));

llvm/lib/Transforms/Scalar/LoopFuse.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,7 @@ struct LoopFuser {
791791

792792
ValueToValueMapTy VMap;
793793
FC0.Peeled =
794-
peelLoop(FC0.L, PeelCount, false, &LI, &SE, DT, &AC, true, VMap);
794+
peelLoop(FC0.L, PeelCount, false, &LI, &SE, &TTI, DT, &AC, true, VMap);
795795
if (FC0.Peeled) {
796796
LLVM_DEBUG(dbgs() << "Done Peeling\n");
797797

@@ -2084,7 +2084,7 @@ PreservedAnalyses LoopFusePass::run(Function &F, FunctionAnalysisManager &AM) {
20842084
bool Changed = false;
20852085
for (auto &L : LI) {
20862086
Changed |=
2087-
simplifyLoop(L, &DT, &LI, &SE, &AC, nullptr, false /* PreserveLCSSA */);
2087+
simplifyLoop(L, &DT, &LI, &SE, &AC, nullptr, &TTI, false /* PreserveLCSSA */);
20882088
}
20892089
if (Changed)
20902090
PDT.recalculate(F);

llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ static bool eliminateLoadsAcrossLoops(Function &F, LoopInfo &LI,
645645
BlockFrequencyInfo *BFI,
646646
ProfileSummaryInfo *PSI,
647647
ScalarEvolution *SE, AssumptionCache *AC,
648-
LoopAccessInfoManager &LAIs) {
648+
LoopAccessInfoManager &LAIs, const TargetTransformInfo *TTI) {
649649
// Build up a worklist of inner-loops to transform to avoid iterator
650650
// invalidation.
651651
// FIXME: This logic comes from other passes that actually change the loop
@@ -657,7 +657,7 @@ static bool eliminateLoadsAcrossLoops(Function &F, LoopInfo &LI,
657657

658658
for (Loop *TopLevelLoop : LI)
659659
for (Loop *L : depth_first(TopLevelLoop)) {
660-
Changed |= simplifyLoop(L, &DT, &LI, SE, AC, /*MSSAU*/ nullptr, false);
660+
Changed |= simplifyLoop(L, &DT, &LI, SE, AC, /*MSSAU*/ nullptr, TTI, false);
661661
// We only handle inner-most loops.
662662
if (L->isInnermost())
663663
Worklist.push_back(L);
@@ -692,8 +692,9 @@ PreservedAnalyses LoopLoadEliminationPass::run(Function &F,
692692
auto *BFI = (PSI && PSI->hasProfileSummary()) ?
693693
&AM.getResult<BlockFrequencyAnalysis>(F) : nullptr;
694694
LoopAccessInfoManager &LAIs = AM.getResult<LoopAccessAnalysis>(F);
695+
auto &TTI = AM.getResult<TargetIRAnalysis>(F);
695696

696-
bool Changed = eliminateLoadsAcrossLoops(F, LI, DT, BFI, PSI, &SE, &AC, LAIs);
697+
bool Changed = eliminateLoadsAcrossLoops(F, LI, DT, BFI, PSI, &SE, &AC, LAIs, &TTI);
697698

698699
if (!Changed)
699700
return PreservedAnalyses::all();

llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,7 +1314,7 @@ tryToUnrollLoop(Loop *L, DominatorTree &DT, LoopInfo *LI, ScalarEvolution &SE,
13141314
});
13151315

13161316
ValueToValueMapTy VMap;
1317-
if (peelLoop(L, PP.PeelCount, PP.PeelLast, LI, &SE, DT, &AC, PreserveLCSSA,
1317+
if (peelLoop(L, PP.PeelCount, PP.PeelLast, LI, &SE, &TTI, DT, &AC, PreserveLCSSA,
13181318
VMap)) {
13191319
simplifyLoopAfterUnroll(L, true, LI, &SE, &DT, &AC, &TTI, nullptr);
13201320
// If the loop was peeled, we already "used up" the profile information
@@ -1624,7 +1624,7 @@ PreservedAnalyses LoopUnrollPass::run(Function &F,
16241624
// unrolled.
16251625
for (const auto &L : LI) {
16261626
Changed |=
1627-
simplifyLoop(L, &DT, &LI, &SE, &AC, nullptr, false /* PreserveLCSSA */);
1627+
simplifyLoop(L, &DT, &LI, &SE, &AC, nullptr, &TTI, false /* PreserveLCSSA */);
16281628
Changed |= formLCSSARecursively(*L, DT, &LI, &SE);
16291629
}
16301630

llvm/lib/Transforms/Utils/LoopConstrainer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -460,8 +460,8 @@ static void DisableAllLoopOptsOnLoop(Loop &L) {
460460
LoopConstrainer::LoopConstrainer(Loop &L, LoopInfo &LI,
461461
function_ref<void(Loop *, bool)> LPMAddNewLoop,
462462
const LoopStructure &LS, ScalarEvolution &SE,
463-
DominatorTree &DT, Type *T, SubRanges SR)
464-
: F(*L.getHeader()->getParent()), Ctx(L.getHeader()->getContext()), SE(SE),
463+
TargetTransformInfo &TTI, DominatorTree &DT, Type *T, SubRanges SR)
464+
: F(*L.getHeader()->getParent()), Ctx(L.getHeader()->getContext()), SE(SE), TTI(TTI),
465465
DT(DT), LI(LI), LPMAddNewLoop(LPMAddNewLoop), OriginalLoop(L), RangeTy(T),
466466
MainLoopStructure(LS), SR(SR) {}
467467

@@ -872,7 +872,7 @@ bool LoopConstrainer::run() {
872872
// This function canonicalizes the loop into Loop-Simplify and LCSSA forms.
873873
auto CanonicalizeLoop = [&](Loop *L, bool IsOriginalLoop) {
874874
formLCSSARecursively(*L, DT, &LI, &SE);
875-
simplifyLoop(L, &DT, &LI, &SE, nullptr, nullptr, true);
875+
simplifyLoop(L, &DT, &LI, &SE, nullptr, nullptr, &TTI, true);
876876
// Pre/post loops are slow paths, we do not need to perform any loop
877877
// optimizations on them.
878878
if (!IsOriginalLoop)

llvm/lib/Transforms/Utils/LoopPeel.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ bool llvm::canPeelLastIteration(const Loop &L, ScalarEvolution &SE) {
351351
m_BasicBlock(Succ1), m_BasicBlock(Succ2))) &&
352352
((Pred == CmpInst::ICMP_EQ && Succ2 == L.getHeader()) ||
353353
(Pred == CmpInst::ICMP_NE && Succ1 == L.getHeader())) &&
354-
Bound->getType()->isIntegerTy() &&
354+
Bound->getType()->isIntegerTy() &&
355355
SE.isLoopInvariant(SE.getSCEV(Bound), &L) &&
356356
match(SE.getSCEV(Inc),
357357
m_scev_AffineAddRec(m_SCEV(), m_scev_One(), m_SpecificLoop(&L)));
@@ -1030,7 +1030,7 @@ llvm::gatherPeelingPreferences(Loop *L, ScalarEvolution &SE,
10301030
/// for the bulk of dynamic execution, can be further simplified by scalar
10311031
/// optimizations.
10321032
bool llvm::peelLoop(Loop *L, unsigned PeelCount, bool PeelLast, LoopInfo *LI,
1033-
ScalarEvolution *SE, DominatorTree &DT, AssumptionCache *AC,
1033+
ScalarEvolution *SE, const TargetTransformInfo *TTI, DominatorTree &DT, AssumptionCache *AC,
10341034
bool PreserveLCSSA, ValueToValueMapTy &LVMap) {
10351035
assert(PeelCount > 0 && "Attempt to peel out zero iterations?");
10361036
assert(canPeel(L) && "Attempt to peel a loop which is not peelable?");
@@ -1308,7 +1308,7 @@ bool llvm::peelLoop(Loop *L, unsigned PeelCount, bool PeelLast, LoopInfo *LI,
13081308
#endif
13091309

13101310
// FIXME: Incrementally update loop-simplify
1311-
simplifyLoop(L, &DT, LI, SE, AC, nullptr, PreserveLCSSA);
1311+
simplifyLoop(L, &DT, LI, SE, AC, nullptr, TTI, PreserveLCSSA);
13121312

13131313
NumPeeled++;
13141314
NumPeeledEnd += PeelLast;

0 commit comments

Comments
 (0)