diff options
| author | David L. Jones <dlj@google.com> | 2019-08-14 04:50:33 +0000 | 
|---|---|---|
| committer | David L. Jones <dlj@google.com> | 2019-08-14 04:50:33 +0000 | 
| commit | d4edd9d97e4e9200d885297c79b7e7b55961dae8 (patch) | |
| tree | 0a6881cc42aa10305372a77e73f2f2a08cad5106 | |
| parent | 20644a9540c85f1d6af601fd7ca56f758831601e (diff) | |
| download | bcm5719-llvm-d4edd9d97e4e9200d885297c79b7e7b55961dae8.tar.gz bcm5719-llvm-d4edd9d97e4e9200d885297c79b7e7b55961dae8.zip  | |
Revert '[LICM] Make Loop ICM profile aware' and 'Fix pass dependency for LICM'
This reverts r368526 (git commit 7e71aa24bc0788690fea7f0d7eab400c6a784deb)
This reverts r368542 (git commit cb5a90fd314a7914cf293797bb4fd7a6841052cf)
llvm-svn: 368800
| -rw-r--r-- | llvm/include/llvm/Transforms/Utils/LoopUtils.h | 15 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LICM.cpp | 93 | ||||
| -rw-r--r-- | llvm/test/Other/opt-O2-pipeline.ll | 10 | ||||
| -rw-r--r-- | llvm/test/Other/opt-O3-pipeline.ll | 10 | ||||
| -rw-r--r-- | llvm/test/Other/opt-Os-pipeline.ll | 10 | ||||
| -rw-r--r-- | llvm/test/Other/pass-pipelines.ll | 2 | ||||
| -rw-r--r-- | llvm/test/Transforms/LICM/sink.ll | 10 | 
7 files changed, 28 insertions, 122 deletions
diff --git a/llvm/include/llvm/Transforms/Utils/LoopUtils.h b/llvm/include/llvm/Transforms/Utils/LoopUtils.h index 36d1eef64b0..d32f08717e9 100644 --- a/llvm/include/llvm/Transforms/Utils/LoopUtils.h +++ b/llvm/include/llvm/Transforms/Utils/LoopUtils.h @@ -37,7 +37,6 @@ namespace llvm {  class AliasSet;  class AliasSetTracker;  class BasicBlock; -class BlockFrequencyInfo;  class DataLayout;  class Loop;  class LoopInfo; @@ -115,26 +114,26 @@ struct SinkAndHoistLICMFlags {  /// reverse depth first order w.r.t the DominatorTree. This allows us to visit  /// uses before definitions, allowing us to sink a loop body in one pass without  /// iteration. Takes DomTreeNode, AliasAnalysis, LoopInfo, DominatorTree, -/// BlockFrequencyInfo, TargetLibraryInfo, Loop, AliasSet information for all +/// DataLayout, TargetLibraryInfo, Loop, AliasSet information for all  /// instructions of the loop and loop safety information as  /// arguments. Diagnostics is emitted via \p ORE. It returns changed status.  bool sinkRegion(DomTreeNode *, AliasAnalysis *, LoopInfo *, DominatorTree *, -                BlockFrequencyInfo *, TargetLibraryInfo *, TargetTransformInfo *, -                Loop *, AliasSetTracker *, MemorySSAUpdater *, ICFLoopSafetyInfo *, +                TargetLibraryInfo *, TargetTransformInfo *, Loop *, +                AliasSetTracker *, MemorySSAUpdater *, ICFLoopSafetyInfo *,                  SinkAndHoistLICMFlags &, OptimizationRemarkEmitter *);  /// Walk the specified region of the CFG (defined by all blocks  /// dominated by the specified block, and that are in the current loop) in depth  /// first order w.r.t the DominatorTree.  This allows us to visit definitions  /// before uses, allowing us to hoist a loop body in one pass without iteration. -/// Takes DomTreeNode, AliasAnalysis, LoopInfo, DominatorTree, BlockFrequencyInfo, +/// Takes DomTreeNode, AliasAnalysis, LoopInfo, DominatorTree, DataLayout,  /// TargetLibraryInfo, Loop, AliasSet information for all instructions of the  /// loop and loop safety information as arguments. Diagnostics is emitted via \p  /// ORE. It returns changed status.  bool hoistRegion(DomTreeNode *, AliasAnalysis *, LoopInfo *, DominatorTree *, -                 BlockFrequencyInfo *, TargetLibraryInfo *, Loop *, AliasSetTracker *, -                 MemorySSAUpdater *, ICFLoopSafetyInfo *, SinkAndHoistLICMFlags &,  -                 OptimizationRemarkEmitter *); +                 TargetLibraryInfo *, Loop *, AliasSetTracker *, +                 MemorySSAUpdater *, ICFLoopSafetyInfo *, +                 SinkAndHoistLICMFlags &, OptimizationRemarkEmitter *);  /// This function deletes dead loops. The caller of this function needs to  /// guarantee that the loop is infact dead. diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp index 4d76f647a81..572b69fb890 100644 --- a/llvm/lib/Transforms/Scalar/LICM.cpp +++ b/llvm/lib/Transforms/Scalar/LICM.cpp @@ -95,11 +95,6 @@ static cl::opt<bool> ControlFlowHoisting(      "licm-control-flow-hoisting", cl::Hidden, cl::init(false),      cl::desc("Enable control flow (and PHI) hoisting in LICM")); -static cl::opt<unsigned> HoistSinkColdnessThreshold( -    "licm-coldness-threshold", cl::Hidden, cl::init(4), -    cl::desc("Relative coldness Threshold of hoisting/sinking destination " -             "block for LICM to be considered beneficial")); -  static cl::opt<uint32_t> MaxNumUsesTraversed(      "licm-max-num-uses-traversed", cl::Hidden, cl::init(8),      cl::desc("Max num uses visited for identifying load " @@ -144,9 +139,8 @@ static void hoist(Instruction &I, const DominatorTree *DT, const Loop *CurLoop,                    BasicBlock *Dest, ICFLoopSafetyInfo *SafetyInfo,                    MemorySSAUpdater *MSSAU, OptimizationRemarkEmitter *ORE);  static bool sink(Instruction &I, LoopInfo *LI, DominatorTree *DT, -                 BlockFrequencyInfo *BFI, const Loop *CurLoop, -                 ICFLoopSafetyInfo *SafetyInfo, MemorySSAUpdater *MSSAU, -                 OptimizationRemarkEmitter *ORE); +                 const Loop *CurLoop, ICFLoopSafetyInfo *SafetyInfo, +                 MemorySSAUpdater *MSSAU, OptimizationRemarkEmitter *ORE);  static bool isSafeToExecuteUnconditionally(Instruction &Inst,                                             const DominatorTree *DT,                                             const Loop *CurLoop, @@ -174,8 +168,8 @@ namespace {  struct LoopInvariantCodeMotion {    using ASTrackerMapTy = DenseMap<Loop *, std::unique_ptr<AliasSetTracker>>;    bool runOnLoop(Loop *L, AliasAnalysis *AA, LoopInfo *LI, DominatorTree *DT, -                 BlockFrequencyInfo *BFI, TargetLibraryInfo *TLI, -                 TargetTransformInfo *TTI, ScalarEvolution *SE, MemorySSA *MSSA, +                 TargetLibraryInfo *TLI, TargetTransformInfo *TTI, +                 ScalarEvolution *SE, MemorySSA *MSSA,                   OptimizationRemarkEmitter *ORE, bool DeleteAST);    ASTrackerMapTy &getLoopToAliasSetMap() { return LoopToAliasSetMap; } @@ -226,7 +220,6 @@ struct LegacyLICMPass : public LoopPass {                            &getAnalysis<AAResultsWrapperPass>().getAAResults(),                            &getAnalysis<LoopInfoWrapperPass>().getLoopInfo(),                            &getAnalysis<DominatorTreeWrapperPass>().getDomTree(), -                          &getAnalysis<BlockFrequencyInfoWrapperPass>().getBFI(),                            &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(),                            &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(                                *L->getHeader()->getParent()), @@ -237,7 +230,6 @@ struct LegacyLICMPass : public LoopPass {    /// loop preheaders be inserted into the CFG...    ///    void getAnalysisUsage(AnalysisUsage &AU) const override { -    AU.addRequired<BlockFrequencyInfoWrapperPass>();      AU.addPreserved<DominatorTreeWrapperPass>();      AU.addPreserved<LoopInfoWrapperPass>();      AU.addRequired<TargetLibraryInfoWrapperPass>(); @@ -294,8 +286,7 @@ PreservedAnalyses LICMPass::run(Loop &L, LoopAnalysisManager &AM,                         "cached at a higher level");    LoopInvariantCodeMotion LICM(LicmMssaOptCap, LicmMssaNoAccForPromotionCap); -  auto BFI = FAM.getCachedResult<BlockFrequencyAnalysis>(*F); -  if (!LICM.runOnLoop(&L, &AR.AA, &AR.LI, &AR.DT, BFI, &AR.TLI, &AR.TTI, &AR.SE, +  if (!LICM.runOnLoop(&L, &AR.AA, &AR.LI, &AR.DT, &AR.TLI, &AR.TTI, &AR.SE,                        AR.MSSA, ORE, true))      return PreservedAnalyses::all(); @@ -313,7 +304,6 @@ char LegacyLICMPass::ID = 0;  INITIALIZE_PASS_BEGIN(LegacyLICMPass, "licm", "Loop Invariant Code Motion",                        false, false)  INITIALIZE_PASS_DEPENDENCY(LoopPass) -INITIALIZE_PASS_DEPENDENCY(BlockFrequencyInfoWrapperPass)  INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)  INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)  INITIALIZE_PASS_DEPENDENCY(MemorySSAWrapperPass) @@ -334,9 +324,8 @@ Pass *llvm::createLICMPass(unsigned LicmMssaOptCap,  ///  bool LoopInvariantCodeMotion::runOnLoop(      Loop *L, AliasAnalysis *AA, LoopInfo *LI, DominatorTree *DT, -    BlockFrequencyInfo *BFI, TargetLibraryInfo *TLI, TargetTransformInfo *TTI, -    ScalarEvolution *SE, MemorySSA *MSSA, OptimizationRemarkEmitter *ORE, -    bool DeleteAST) { +    TargetLibraryInfo *TLI, TargetTransformInfo *TTI, ScalarEvolution *SE, +    MemorySSA *MSSA, OptimizationRemarkEmitter *ORE, bool DeleteAST) {    bool Changed = false;    assert(L->isLCSSAForm(*DT) && "Loop is not in LCSSA form."); @@ -396,11 +385,11 @@ bool LoopInvariantCodeMotion::runOnLoop(                                   LicmMssaOptCap, LicmMssaNoAccForPromotionCap,                                   /*IsSink=*/true};    if (L->hasDedicatedExits()) -    Changed |= sinkRegion(DT->getNode(L->getHeader()), AA, LI, DT, BFI, TLI, TTI, L, +    Changed |= sinkRegion(DT->getNode(L->getHeader()), AA, LI, DT, TLI, TTI, L,                            CurAST.get(), MSSAU.get(), &SafetyInfo, Flags, ORE);    Flags.IsSink = false;    if (Preheader) -    Changed |= hoistRegion(DT->getNode(L->getHeader()), AA, LI, DT, BFI, TLI, L, +    Changed |= hoistRegion(DT->getNode(L->getHeader()), AA, LI, DT, TLI, L,                             CurAST.get(), MSSAU.get(), &SafetyInfo, Flags, ORE);    // Now that all loop invariants have been removed from the loop, promote any @@ -502,10 +491,9 @@ bool LoopInvariantCodeMotion::runOnLoop(  /// definitions, allowing us to sink a loop body in one pass without iteration.  ///  bool llvm::sinkRegion(DomTreeNode *N, AliasAnalysis *AA, LoopInfo *LI, -                      DominatorTree *DT, BlockFrequencyInfo *BFI, -                      TargetLibraryInfo *TLI, TargetTransformInfo *TTI, -                      Loop *CurLoop, AliasSetTracker *CurAST, -                      MemorySSAUpdater *MSSAU, +                      DominatorTree *DT, TargetLibraryInfo *TLI, +                      TargetTransformInfo *TTI, Loop *CurLoop, +                      AliasSetTracker *CurAST, MemorySSAUpdater *MSSAU,                        ICFLoopSafetyInfo *SafetyInfo,                        SinkAndHoistLICMFlags &Flags,                        OptimizationRemarkEmitter *ORE) { @@ -554,7 +542,7 @@ bool llvm::sinkRegion(DomTreeNode *N, AliasAnalysis *AA, LoopInfo *LI,            canSinkOrHoistInst(I, AA, DT, CurLoop, CurAST, MSSAU, true, &Flags,                               ORE) &&            !I.mayHaveSideEffects()) { -        if (sink(I, LI, DT, BFI, CurLoop, SafetyInfo, MSSAU, ORE)) { +        if (sink(I, LI, DT, CurLoop, SafetyInfo, MSSAU, ORE)) {            if (!FreeInLoop) {              ++II;              eraseInstruction(I, *SafetyInfo, CurAST, MSSAU); @@ -798,43 +786,13 @@ public:  };  } // namespace -// Hoisting/sinking instruction out of a loop isn't always beneficial. It's only -// only worthwhile if the destination block is actually colder than current -// block. -static bool worthSinkOrHoistInst(Instruction &I, BasicBlock *DstBlock, -                                 OptimizationRemarkEmitter *ORE, -                                 BlockFrequencyInfo *BFI) { -  // Check block frequency only when runtime profile is available. -  // to avoid pathological cases. With static profile, lean towards -  // hosting because it helps canonicalize the loop for vectorizer. -  if (!DstBlock->getParent()->hasProfileData()) -    return true; - -  if (!HoistSinkColdnessThreshold || !BFI) -    return true; - -  BasicBlock *SrcBlock = I.getParent(); -  if (BFI->getBlockFreq(DstBlock).getFrequency() / HoistSinkColdnessThreshold > -      BFI->getBlockFreq(SrcBlock).getFrequency()) { -    ORE->emit([&]() { -      return OptimizationRemarkMissed(DEBUG_TYPE, "SinkHoistInst", &I) -             << "failed to sink or hoist instruction because containing block " -                "has lower frequency than destination block"; -    }); -    return false; -  } - -  return true; -} -  /// Walk the specified region of the CFG (defined by all blocks dominated by  /// the specified block, and that are in the current loop) in depth first  /// order w.r.t the DominatorTree.  This allows us to visit definitions before  /// uses, allowing us to hoist a loop body in one pass without iteration.  ///  bool llvm::hoistRegion(DomTreeNode *N, AliasAnalysis *AA, LoopInfo *LI, -                       DominatorTree *DT, BlockFrequencyInfo *BFI, -                       TargetLibraryInfo *TLI, Loop *CurLoop, +                       DominatorTree *DT, TargetLibraryInfo *TLI, Loop *CurLoop,                         AliasSetTracker *CurAST, MemorySSAUpdater *MSSAU,                         ICFLoopSafetyInfo *SafetyInfo,                         SinkAndHoistLICMFlags &Flags, @@ -885,15 +843,13 @@ bool llvm::hoistRegion(DomTreeNode *N, AliasAnalysis *AA, LoopInfo *LI,        // Try hoisting the instruction out to the preheader.  We can only do        // this if all of the operands of the instruction are loop invariant and -      // if it is safe to hoist the instruction. We also check block frequency -      // to make sure instruction only gets hoisted into colder blocks. +      // if it is safe to hoist the instruction.        // TODO: It may be safe to hoist if we are hoisting to a conditional block        // and we have accurately duplicated the control flow from the loop header        // to that block.        if (CurLoop->hasLoopInvariantOperands(&I) &&            canSinkOrHoistInst(I, AA, DT, CurLoop, CurAST, MSSAU, true, &Flags,                               ORE) && -          worthSinkOrHoistInst(I, CurLoop->getLoopPreheader(), ORE, BFI) &&            isSafeToExecuteUnconditionally(                I, DT, CurLoop, SafetyInfo, ORE,                CurLoop->getLoopPreheader()->getTerminator())) { @@ -1594,9 +1550,8 @@ static void splitPredecessorsOfLoopExit(PHINode *PN, DominatorTree *DT,  /// position, and may either delete it or move it to outside of the loop.  ///  static bool sink(Instruction &I, LoopInfo *LI, DominatorTree *DT, -                 BlockFrequencyInfo *BFI, const Loop *CurLoop, -                 ICFLoopSafetyInfo *SafetyInfo, MemorySSAUpdater *MSSAU, -                 OptimizationRemarkEmitter *ORE) { +                 const Loop *CurLoop, ICFLoopSafetyInfo *SafetyInfo, +                 MemorySSAUpdater *MSSAU, OptimizationRemarkEmitter *ORE) {    LLVM_DEBUG(dbgs() << "LICM sinking instruction: " << I << "\n");    ORE->emit([&]() {      return OptimizationRemark(DEBUG_TYPE, "InstSunk", &I) @@ -1672,10 +1627,7 @@ static bool sink(Instruction &I, LoopInfo *LI, DominatorTree *DT,    // If this instruction is only used outside of the loop, then all users are    // PHI nodes in exit blocks due to LCSSA form. Just RAUW them with clones of    // the instruction. -  // First check if I is worth sinking for all uses. Sink only when it is worth -  // across all uses.    SmallSetVector<User*, 8> Users(I.user_begin(), I.user_end()); -  SmallVector<PHINode*, 8> ExitPNs;    for (auto *UI : Users) {      auto *User = cast<Instruction>(UI); @@ -1685,15 +1637,6 @@ static bool sink(Instruction &I, LoopInfo *LI, DominatorTree *DT,      PHINode *PN = cast<PHINode>(User);      assert(ExitBlockSet.count(PN->getParent()) &&             "The LCSSA PHI is not in an exit block!"); - -    if (!worthSinkOrHoistInst(I, PN->getParent(), ORE, BFI)) { -      return Changed; -    } - -    ExitPNs.push_back(PN); -  } - -  for (auto *PN: ExitPNs) {      // The PHI must be trivially replaceable.      Instruction *New = sinkThroughTriviallyReplaceablePHI(          PN, &I, LI, SunkCopies, SafetyInfo, CurLoop, MSSAU); @@ -2027,7 +1970,7 @@ bool llvm::promoteLoopAccessesToScalars(          // Note that proving a load safe to speculate requires proving          // sufficient alignment at the target location.  Proving it guaranteed          // to execute does as well.  Thus we can increase our guaranteed -        // alignment as well. +        // alignment as well.           if (!DereferenceableInPH || (InstAlignment > Alignment))            if (isSafeToExecuteUnconditionally(*Load, DT, CurLoop, SafetyInfo,                                               ORE, Preheader->getTerminator())) { diff --git a/llvm/test/Other/opt-O2-pipeline.ll b/llvm/test/Other/opt-O2-pipeline.ll index 10170fe53e1..ecd6b7c8a35 100644 --- a/llvm/test/Other/opt-O2-pipeline.ll +++ b/llvm/test/Other/opt-O2-pipeline.ll @@ -102,11 +102,7 @@  ; CHECK-NEXT:         Scalar Evolution Analysis  ; CHECK-NEXT:         Loop Pass Manager  ; CHECK-NEXT:           Rotate Loops -; CHECK-NEXT:         Branch Probability Analysis -; CHECK-NEXT:         Block Frequency Analysis -; CHECK-NEXT:         Loop Pass Manager  ; CHECK-NEXT:           Loop Invariant Code Motion -; CHECK-NEXT:         Loop Pass Manager  ; CHECK-NEXT:           Unswitch loops  ; CHECK-NEXT:         Simplify the CFG  ; CHECK-NEXT:         Dominator Tree Construction @@ -158,15 +154,12 @@  ; CHECK-NEXT:         Memory Dependence Analysis  ; CHECK-NEXT:         Dead Store Elimination  ; CHECK-NEXT:         Natural Loop Information -; CHECK-NEXT:         Branch Probability Analysis -; CHECK-NEXT:         Block Frequency Analysis  ; CHECK-NEXT:         Canonicalize natural loops  ; CHECK-NEXT:         LCSSA Verifier  ; CHECK-NEXT:         Loop-Closed SSA Form Pass  ; CHECK-NEXT:         Basic Alias Analysis (stateless AA impl)  ; CHECK-NEXT:         Function Alias Analysis Results  ; CHECK-NEXT:         Scalar Evolution Analysis -; CHECK-NEXT:         Block Frequency Analysis  ; CHECK-NEXT:         Loop Pass Manager  ; CHECK-NEXT:           Loop Invariant Code Motion  ; CHECK-NEXT:         Post-Dominator Tree Construction @@ -253,13 +246,10 @@  ; CHECK-NEXT:       Lazy Block Frequency Analysis  ; CHECK-NEXT:       Optimization Remark Emitter  ; CHECK-NEXT:       Combine redundant instructions -; CHECK-NEXT:       Branch Probability Analysis -; CHECK-NEXT:       Block Frequency Analysis  ; CHECK-NEXT:       Canonicalize natural loops  ; CHECK-NEXT:       LCSSA Verifier  ; CHECK-NEXT:       Loop-Closed SSA Form Pass  ; CHECK-NEXT:       Scalar Evolution Analysis -; CHECK-NEXT:       Block Frequency Analysis  ; CHECK-NEXT:       Loop Pass Manager  ; CHECK-NEXT:         Loop Invariant Code Motion  ; CHECK-NEXT:       Lazy Branch Probability Analysis diff --git a/llvm/test/Other/opt-O3-pipeline.ll b/llvm/test/Other/opt-O3-pipeline.ll index edc2acf9a08..ee5e55f0d37 100644 --- a/llvm/test/Other/opt-O3-pipeline.ll +++ b/llvm/test/Other/opt-O3-pipeline.ll @@ -107,11 +107,7 @@  ; CHECK-NEXT:         Scalar Evolution Analysis  ; CHECK-NEXT:         Loop Pass Manager  ; CHECK-NEXT:           Rotate Loops -; CHECK-NEXT:         Branch Probability Analysis -; CHECK-NEXT:         Block Frequency Analysis -; CHECK-NEXT:         Loop Pass Manager  ; CHECK-NEXT:           Loop Invariant Code Motion -; CHECK-NEXT:         Loop Pass Manager  ; CHECK-NEXT:           Unswitch loops  ; CHECK-NEXT:         Simplify the CFG  ; CHECK-NEXT:         Dominator Tree Construction @@ -163,15 +159,12 @@  ; CHECK-NEXT:         Memory Dependence Analysis  ; CHECK-NEXT:         Dead Store Elimination  ; CHECK-NEXT:         Natural Loop Information -; CHECK-NEXT:         Branch Probability Analysis -; CHECK-NEXT:         Block Frequency Analysis  ; CHECK-NEXT:         Canonicalize natural loops  ; CHECK-NEXT:         LCSSA Verifier  ; CHECK-NEXT:         Loop-Closed SSA Form Pass  ; CHECK-NEXT:         Basic Alias Analysis (stateless AA impl)  ; CHECK-NEXT:         Function Alias Analysis Results  ; CHECK-NEXT:         Scalar Evolution Analysis -; CHECK-NEXT:         Block Frequency Analysis  ; CHECK-NEXT:         Loop Pass Manager  ; CHECK-NEXT:           Loop Invariant Code Motion  ; CHECK-NEXT:         Post-Dominator Tree Construction @@ -258,13 +251,10 @@  ; CHECK-NEXT:       Lazy Block Frequency Analysis  ; CHECK-NEXT:       Optimization Remark Emitter  ; CHECK-NEXT:       Combine redundant instructions -; CHECK-NEXT:       Branch Probability Analysis -; CHECK-NEXT:       Block Frequency Analysis  ; CHECK-NEXT:       Canonicalize natural loops  ; CHECK-NEXT:       LCSSA Verifier  ; CHECK-NEXT:       Loop-Closed SSA Form Pass  ; CHECK-NEXT:       Scalar Evolution Analysis -; CHECK-NEXT:       Block Frequency Analysis  ; CHECK-NEXT:       Loop Pass Manager  ; CHECK-NEXT:         Loop Invariant Code Motion  ; CHECK-NEXT:       Lazy Branch Probability Analysis diff --git a/llvm/test/Other/opt-Os-pipeline.ll b/llvm/test/Other/opt-Os-pipeline.ll index fd22033260b..069d198c7a1 100644 --- a/llvm/test/Other/opt-Os-pipeline.ll +++ b/llvm/test/Other/opt-Os-pipeline.ll @@ -89,11 +89,7 @@  ; CHECK-NEXT:         Scalar Evolution Analysis  ; CHECK-NEXT:         Loop Pass Manager  ; CHECK-NEXT:           Rotate Loops -; CHECK-NEXT:         Branch Probability Analysis -; CHECK-NEXT:         Block Frequency Analysis -; CHECK-NEXT:         Loop Pass Manager  ; CHECK-NEXT:           Loop Invariant Code Motion -; CHECK-NEXT:         Loop Pass Manager  ; CHECK-NEXT:           Unswitch loops  ; CHECK-NEXT:         Simplify the CFG  ; CHECK-NEXT:         Dominator Tree Construction @@ -145,15 +141,12 @@  ; CHECK-NEXT:         Memory Dependence Analysis  ; CHECK-NEXT:         Dead Store Elimination  ; CHECK-NEXT:         Natural Loop Information -; CHECK-NEXT:         Branch Probability Analysis -; CHECK-NEXT:         Block Frequency Analysis  ; CHECK-NEXT:         Canonicalize natural loops  ; CHECK-NEXT:         LCSSA Verifier  ; CHECK-NEXT:         Loop-Closed SSA Form Pass  ; CHECK-NEXT:         Basic Alias Analysis (stateless AA impl)  ; CHECK-NEXT:         Function Alias Analysis Results  ; CHECK-NEXT:         Scalar Evolution Analysis -; CHECK-NEXT:         Block Frequency Analysis  ; CHECK-NEXT:         Loop Pass Manager  ; CHECK-NEXT:           Loop Invariant Code Motion  ; CHECK-NEXT:         Post-Dominator Tree Construction @@ -240,13 +233,10 @@  ; CHECK-NEXT:       Lazy Block Frequency Analysis  ; CHECK-NEXT:       Optimization Remark Emitter  ; CHECK-NEXT:       Combine redundant instructions -; CHECK-NEXT:       Branch Probability Analysis -; CHECK-NEXT:       Block Frequency Analysis  ; CHECK-NEXT:       Canonicalize natural loops  ; CHECK-NEXT:       LCSSA Verifier  ; CHECK-NEXT:       Loop-Closed SSA Form Pass  ; CHECK-NEXT:       Scalar Evolution Analysis -; CHECK-NEXT:       Block Frequency Analysis  ; CHECK-NEXT:       Loop Pass Manager  ; CHECK-NEXT:         Loop Invariant Code Motion  ; CHECK-NEXT:       Lazy Branch Probability Analysis diff --git a/llvm/test/Other/pass-pipelines.ll b/llvm/test/Other/pass-pipelines.ll index d66bbb84d69..be14c6cdeb6 100644 --- a/llvm/test/Other/pass-pipelines.ll +++ b/llvm/test/Other/pass-pipelines.ll @@ -52,7 +52,7 @@  ; CHECK-O2-NEXT: FunctionPass Manager  ; CHECK-O2-NOT: Manager  ; CHECK-O2: Loop Pass Manager -; Requiring block frequency for LICM will place ICM and rotation under separate Loop Pass Manager +; CHECK-O2-NOT: Manager  ; FIXME: We shouldn't be pulling out to simplify-cfg and instcombine and  ; causing new loop pass managers.  ; CHECK-O2: Simplify the CFG diff --git a/llvm/test/Transforms/LICM/sink.ll b/llvm/test/Transforms/LICM/sink.ll index 7671a6350a4..17170f5af19 100644 --- a/llvm/test/Transforms/LICM/sink.ll +++ b/llvm/test/Transforms/LICM/sink.ll @@ -1,10 +1,8 @@ -; RUN: opt -S -licm -licm -licm-coldness-threshold=0 < %s | FileCheck %s --check-prefix=CHECK-LICM  -; RUN: opt -S -licm -licm < %s | FileCheck %s --check-prefix=CHECK-BFI-LICM +; RUN: opt -S -licm < %s | FileCheck %s --check-prefix=CHECK-LICM  ; RUN: opt -S -licm < %s | opt -S -loop-sink | FileCheck %s --check-prefix=CHECK-SINK  ; RUN: opt -S < %s -passes='require<opt-remark-emit>,loop(licm),loop-sink' \  ; RUN:     | FileCheck %s --check-prefix=CHECK-SINK -; RUN: opt -S -licm -licm-coldness-threshold=0 -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s --check-prefix=CHECK-LICM -; RUN: opt -S -licm -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s --check-prefix=CHECK-BFI-LICM +; RUN: opt -S -licm -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s --check-prefix=CHECK-LICM  ; Original source code:  ; int g; @@ -31,10 +29,6 @@ define i32 @foo(i32, i32) #0 !prof !2 {  ; CHECK-LICM: load i32, i32* @g  ; CHECK-LICM: br label %.lr.ph -; CHECK-BFI-LICM: .lr.ph.preheader: -; CHECK-BFI-LICM-NOT: load i32, i32* @g -; CHECK-BFI-LICM: br label %.lr.ph -  .lr.ph:    %.03 = phi i32 [ %8, %.combine ], [ 0, %.lr.ph.preheader ]    %.012 = phi i32 [ %.1, %.combine ], [ %1, %.lr.ph.preheader ]  | 

