43
43
//
44
44
// ===----------------------------------------------------------------------===//
45
45
46
+ #include " llvm/Transforms/Scalar/InductiveRangeCheckElimination.h"
46
47
#include " llvm/ADT/APInt.h"
47
48
#include " llvm/ADT/ArrayRef.h"
48
49
#include " llvm/ADT/None.h"
52
53
#include " llvm/ADT/StringRef.h"
53
54
#include " llvm/ADT/Twine.h"
54
55
#include " llvm/Analysis/BranchProbabilityInfo.h"
56
+ #include " llvm/Analysis/LoopAnalysisManager.h"
55
57
#include " llvm/Analysis/LoopInfo.h"
56
58
#include " llvm/Analysis/LoopPass.h"
57
59
#include " llvm/Analysis/ScalarEvolution.h"
@@ -235,17 +237,31 @@ class InductiveRangeCheck {
235
237
// / checks, and hence don't end up in \p Checks.
236
238
static void
237
239
extractRangeChecksFromBranch (BranchInst *BI, Loop *L, ScalarEvolution &SE,
238
- BranchProbabilityInfo & BPI,
240
+ BranchProbabilityInfo * BPI,
239
241
SmallVectorImpl<InductiveRangeCheck> &Checks);
240
242
};
241
243
242
- class InductiveRangeCheckElimination : public LoopPass {
244
+ class InductiveRangeCheckElimination {
245
+ ScalarEvolution &SE;
246
+ BranchProbabilityInfo *BPI;
247
+ DominatorTree &DT;
248
+ LoopInfo &LI;
249
+
250
+ public:
251
+ InductiveRangeCheckElimination (ScalarEvolution &SE,
252
+ BranchProbabilityInfo *BPI, DominatorTree &DT,
253
+ LoopInfo &LI)
254
+ : SE(SE), BPI(BPI), DT(DT), LI(LI) {}
255
+
256
+ bool run (Loop *L, function_ref<void (Loop *, bool )> LPMAddNewLoop);
257
+ };
258
+
259
+ class IRCELegacyPass : public LoopPass {
243
260
public:
244
261
static char ID;
245
262
246
- InductiveRangeCheckElimination () : LoopPass(ID) {
247
- initializeInductiveRangeCheckEliminationPass (
248
- *PassRegistry::getPassRegistry ());
263
+ IRCELegacyPass () : LoopPass(ID) {
264
+ initializeIRCELegacyPassPass (*PassRegistry::getPassRegistry ());
249
265
}
250
266
251
267
void getAnalysisUsage (AnalysisUsage &AU) const override {
@@ -258,14 +274,14 @@ class InductiveRangeCheckElimination : public LoopPass {
258
274
259
275
} // end anonymous namespace
260
276
261
- char InductiveRangeCheckElimination ::ID = 0 ;
277
+ char IRCELegacyPass ::ID = 0 ;
262
278
263
- INITIALIZE_PASS_BEGIN (InductiveRangeCheckElimination , " irce" ,
279
+ INITIALIZE_PASS_BEGIN (IRCELegacyPass , " irce" ,
264
280
" Inductive range check elimination" , false , false )
265
281
INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfoWrapperPass)
266
282
INITIALIZE_PASS_DEPENDENCY(LoopPass)
267
- INITIALIZE_PASS_END(InductiveRangeCheckElimination , " irce" ,
268
- " Inductive range check elimination " , false , false )
283
+ INITIALIZE_PASS_END(IRCELegacyPass , " irce" , " Inductive range check elimination " ,
284
+ false , false )
269
285
270
286
StringRef InductiveRangeCheck::rangeCheckKindToStr(
271
287
InductiveRangeCheck::RangeCheckKind RCK) {
@@ -417,15 +433,15 @@ void InductiveRangeCheck::extractRangeChecksFromCond(
417
433
}
418
434
419
435
void InductiveRangeCheck::extractRangeChecksFromBranch (
420
- BranchInst *BI, Loop *L, ScalarEvolution &SE, BranchProbabilityInfo & BPI,
436
+ BranchInst *BI, Loop *L, ScalarEvolution &SE, BranchProbabilityInfo * BPI,
421
437
SmallVectorImpl<InductiveRangeCheck> &Checks) {
422
438
if (BI->isUnconditional () || BI->getParent () == L->getLoopLatch ())
423
439
return ;
424
440
425
441
BranchProbability LikelyTaken (15 , 16 );
426
442
427
- if (!SkipProfitabilityChecks &&
428
- BPI. getEdgeProbability (BI->getParent (), (unsigned )0 ) < LikelyTaken)
443
+ if (!SkipProfitabilityChecks && BPI &&
444
+ BPI-> getEdgeProbability (BI->getParent (), (unsigned )0 ) < LikelyTaken)
429
445
return ;
430
446
431
447
SmallPtrSet<Value *, 8 > Visited;
@@ -516,9 +532,8 @@ struct LoopStructure {
516
532
}
517
533
518
534
static Optional<LoopStructure> parseLoopStructure (ScalarEvolution &,
519
- BranchProbabilityInfo &BPI,
520
- Loop &,
521
- const char *&);
535
+ BranchProbabilityInfo *BPI,
536
+ Loop &, const char *&);
522
537
};
523
538
524
539
// / This class is used to constrain loops to run within a given iteration space.
@@ -585,7 +600,7 @@ class LoopConstrainer {
585
600
// Create the appropriate loop structure needed to describe a cloned copy of
586
601
// `Original`. The clone is described by `VM`.
587
602
Loop *createClonedLoopStructure (Loop *Original, Loop *Parent,
588
- ValueToValueMapTy &VM);
603
+ ValueToValueMapTy &VM, bool IsSubloop );
589
604
590
605
// Rewrite the iteration space of the loop denoted by (LS, Preheader). The
591
606
// iteration space of the rewritten loop ends at ExitLoopAt. The start of the
@@ -637,8 +652,8 @@ class LoopConstrainer {
637
652
LLVMContext &Ctx;
638
653
ScalarEvolution &SE;
639
654
DominatorTree &DT;
640
- LPPassManager &LPM;
641
655
LoopInfo &LI;
656
+ function_ref<void (Loop *, bool )> LPMAddNewLoop;
642
657
643
658
// Information about the original loop we started out with.
644
659
Loop &OriginalLoop;
@@ -658,12 +673,13 @@ class LoopConstrainer {
658
673
LoopStructure MainLoopStructure;
659
674
660
675
public:
661
- LoopConstrainer (Loop &L, LoopInfo &LI, LPPassManager &LPM,
676
+ LoopConstrainer (Loop &L, LoopInfo &LI,
677
+ function_ref<void (Loop *, bool )> LPMAddNewLoop,
662
678
const LoopStructure &LS, ScalarEvolution &SE,
663
679
DominatorTree &DT, InductiveRangeCheck::Range R)
664
680
: F(*L.getHeader()->getParent ()), Ctx(L.getHeader()->getContext()),
665
- SE(SE), DT(DT), LPM(LPM), LI(LI), OriginalLoop(L ), Range(R ),
666
- MainLoopStructure(LS) {}
681
+ SE(SE), DT(DT), LI(LI), LPMAddNewLoop(LPMAddNewLoop ), OriginalLoop(L ),
682
+ Range(R), MainLoopStructure(LS) {}
667
683
668
684
// Entry point for the algorithm. Returns true on success.
669
685
bool run ();
@@ -726,8 +742,8 @@ static bool SumCanReachMin(ScalarEvolution &SE, const SCEV *S1, const SCEV *S2,
726
742
727
743
Optional<LoopStructure>
728
744
LoopStructure::parseLoopStructure (ScalarEvolution &SE,
729
- BranchProbabilityInfo & BPI,
730
- Loop &L, const char *&FailureReason) {
745
+ BranchProbabilityInfo * BPI, Loop &L ,
746
+ const char *&FailureReason) {
731
747
if (!L.isLoopSimplifyForm ()) {
732
748
FailureReason = " loop not in LoopSimplify form" ;
733
749
return None;
@@ -762,7 +778,8 @@ LoopStructure::parseLoopStructure(ScalarEvolution &SE,
762
778
unsigned LatchBrExitIdx = LatchBr->getSuccessor (0 ) == Header ? 1 : 0 ;
763
779
764
780
BranchProbability ExitProbability =
765
- BPI.getEdgeProbability (LatchBr->getParent (), LatchBrExitIdx);
781
+ BPI ? BPI->getEdgeProbability (LatchBr->getParent (), LatchBrExitIdx)
782
+ : BranchProbability::getZero ();
766
783
767
784
if (!SkipProfitabilityChecks &&
768
785
ExitProbability > BranchProbability (1 , MaxExitProbReciprocal)) {
@@ -1396,13 +1413,14 @@ void LoopConstrainer::addToParentLoopIfNeeded(ArrayRef<BasicBlock *> BBs) {
1396
1413
}
1397
1414
1398
1415
Loop *LoopConstrainer::createClonedLoopStructure (Loop *Original, Loop *Parent,
1399
- ValueToValueMapTy &VM) {
1416
+ ValueToValueMapTy &VM,
1417
+ bool IsSubloop) {
1400
1418
Loop &New = *LI.AllocateLoop ();
1401
1419
if (Parent)
1402
1420
Parent->addChildLoop (&New);
1403
1421
else
1404
1422
LI.addTopLevelLoop (&New);
1405
- LPM. addLoop ( New);
1423
+ LPMAddNewLoop (& New, IsSubloop );
1406
1424
1407
1425
// Add all of the blocks in Original to the new loop.
1408
1426
for (auto *BB : Original->blocks ())
@@ -1411,7 +1429,7 @@ Loop *LoopConstrainer::createClonedLoopStructure(Loop *Original, Loop *Parent,
1411
1429
1412
1430
// Add all of the subloops to the new loop.
1413
1431
for (Loop *SubLoop : *Original)
1414
- createClonedLoopStructure (SubLoop, &New, VM);
1432
+ createClonedLoopStructure (SubLoop, &New, VM, /* IsSubloop */ true );
1415
1433
1416
1434
return &New;
1417
1435
}
@@ -1561,13 +1579,15 @@ bool LoopConstrainer::run() {
1561
1579
// LI when LoopSimplifyForm is generated.
1562
1580
Loop *PreL = nullptr , *PostL = nullptr ;
1563
1581
if (!PreLoop.Blocks .empty ()) {
1564
- PreL = createClonedLoopStructure (
1565
- &OriginalLoop, OriginalLoop.getParentLoop (), PreLoop.Map );
1582
+ PreL = createClonedLoopStructure (&OriginalLoop,
1583
+ OriginalLoop.getParentLoop (), PreLoop.Map ,
1584
+ /* IsSubLoop */ false );
1566
1585
}
1567
1586
1568
1587
if (!PostLoop.Blocks .empty ()) {
1569
- PostL = createClonedLoopStructure (
1570
- &OriginalLoop, OriginalLoop.getParentLoop (), PostLoop.Map );
1588
+ PostL =
1589
+ createClonedLoopStructure (&OriginalLoop, OriginalLoop.getParentLoop (),
1590
+ PostLoop.Map , /* IsSubLoop */ false );
1571
1591
}
1572
1592
1573
1593
// This function canonicalizes the loop into Loop-Simplify and LCSSA forms.
@@ -1738,12 +1758,45 @@ IntersectUnsignedRange(ScalarEvolution &SE,
1738
1758
return Ret;
1739
1759
}
1740
1760
1741
- bool InductiveRangeCheckElimination::runOnLoop (Loop *L, LPPassManager &LPM) {
1761
+ PreservedAnalyses IRCEPass::run (Loop &L, LoopAnalysisManager &AM,
1762
+ LoopStandardAnalysisResults &AR,
1763
+ LPMUpdater &U) {
1764
+ Function *F = L.getHeader ()->getParent ();
1765
+ const auto &FAM =
1766
+ AM.getResult <FunctionAnalysisManagerLoopProxy>(L, AR).getManager ();
1767
+ auto *BPI = FAM.getCachedResult <BranchProbabilityAnalysis>(*F);
1768
+ InductiveRangeCheckElimination IRCE (AR.SE , BPI, AR.DT , AR.LI );
1769
+ auto LPMAddNewLoop = [&U](Loop *NL, bool IsSubloop) {
1770
+ if (!IsSubloop)
1771
+ U.addSiblingLoops (NL);
1772
+ };
1773
+ bool Changed = IRCE.run (&L, LPMAddNewLoop);
1774
+ if (!Changed)
1775
+ return PreservedAnalyses::all ();
1776
+
1777
+ return getLoopPassPreservedAnalyses ();
1778
+ }
1779
+
1780
+ bool IRCELegacyPass::runOnLoop (Loop *L, LPPassManager &LPM) {
1742
1781
if (skipLoop (L))
1743
1782
return false ;
1744
1783
1784
+ ScalarEvolution &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE ();
1785
+ BranchProbabilityInfo &BPI =
1786
+ getAnalysis<BranchProbabilityInfoWrapperPass>().getBPI ();
1787
+ auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree ();
1788
+ auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo ();
1789
+ InductiveRangeCheckElimination IRCE (SE, &BPI, DT, LI);
1790
+ auto LPMAddNewLoop = [&LPM](Loop *NL, bool /* IsSubLoop */ ) {
1791
+ LPM.addLoop (*NL);
1792
+ };
1793
+ return IRCE.run (L, LPMAddNewLoop);
1794
+ }
1795
+
1796
+ bool InductiveRangeCheckElimination::run (
1797
+ Loop *L, function_ref<void (Loop *, bool )> LPMAddNewLoop) {
1745
1798
if (L->getBlocks ().size () >= LoopSizeCutoff) {
1746
- DEBUG (dbgs () << " irce: giving up constraining loop, too large\n " ; );
1799
+ DEBUG (dbgs () << " irce: giving up constraining loop, too large\n " );
1747
1800
return false ;
1748
1801
}
1749
1802
@@ -1755,9 +1808,6 @@ bool InductiveRangeCheckElimination::runOnLoop(Loop *L, LPPassManager &LPM) {
1755
1808
1756
1809
LLVMContext &Context = Preheader->getContext ();
1757
1810
SmallVector<InductiveRangeCheck, 16 > RangeChecks;
1758
- ScalarEvolution &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE ();
1759
- BranchProbabilityInfo &BPI =
1760
- getAnalysis<BranchProbabilityInfoWrapperPass>().getBPI ();
1761
1811
1762
1812
for (auto BBI : L->getBlocks ())
1763
1813
if (BranchInst *TBI = dyn_cast<BranchInst>(BBI->getTerminator ()))
@@ -1823,9 +1873,8 @@ bool InductiveRangeCheckElimination::runOnLoop(Loop *L, LPPassManager &LPM) {
1823
1873
if (!SafeIterRange.hasValue ())
1824
1874
return false ;
1825
1875
1826
- auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree ();
1827
- LoopConstrainer LC (*L, getAnalysis<LoopInfoWrapperPass>().getLoopInfo (), LPM,
1828
- LS, SE, DT, SafeIterRange.getValue ());
1876
+ LoopConstrainer LC (*L, LI, LPMAddNewLoop, LS, SE, DT,
1877
+ SafeIterRange.getValue ());
1829
1878
bool Changed = LC.run ();
1830
1879
1831
1880
if (Changed) {
@@ -1855,5 +1904,5 @@ bool InductiveRangeCheckElimination::runOnLoop(Loop *L, LPPassManager &LPM) {
1855
1904
}
1856
1905
1857
1906
Pass *llvm::createInductiveRangeCheckEliminationPass () {
1858
- return new InductiveRangeCheckElimination ;
1907
+ return new IRCELegacyPass () ;
1859
1908
}
0 commit comments