Home | History | Annotate | Download | only in Scalar
      1 //===- llvm/unittest/Analysis/LoopPassManagerTest.cpp - LPM tests ---------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "llvm/Transforms/Scalar/LoopPassManager.h"
     11 #include "llvm/Analysis/AliasAnalysis.h"
     12 #include "llvm/Analysis/AssumptionCache.h"
     13 #include "llvm/Analysis/ScalarEvolution.h"
     14 #include "llvm/Analysis/TargetLibraryInfo.h"
     15 #include "llvm/Analysis/TargetTransformInfo.h"
     16 #include "llvm/AsmParser/Parser.h"
     17 #include "llvm/IR/Dominators.h"
     18 #include "llvm/IR/Function.h"
     19 #include "llvm/IR/LLVMContext.h"
     20 #include "llvm/IR/Module.h"
     21 #include "llvm/IR/PassManager.h"
     22 #include "llvm/Support/SourceMgr.h"
     23 
     24 // Workaround for the gcc 6.1 bug PR80916.
     25 #if defined(__GNUC__) && __GNUC__ > 5
     26 #  pragma GCC diagnostic push
     27 #  pragma GCC diagnostic ignored "-Wunused-function"
     28 #endif
     29 
     30 #include "gmock/gmock.h"
     31 #include "gtest/gtest.h"
     32 
     33 #if defined(__GNUC__) && __GNUC__ > 5
     34 #  pragma GCC diagnostic pop
     35 #endif
     36 
     37 using namespace llvm;
     38 
     39 namespace {
     40 
     41 using testing::DoDefault;
     42 using testing::Return;
     43 using testing::Expectation;
     44 using testing::Invoke;
     45 using testing::InvokeWithoutArgs;
     46 using testing::_;
     47 
     48 template <typename DerivedT, typename IRUnitT,
     49           typename AnalysisManagerT = AnalysisManager<IRUnitT>,
     50           typename... ExtraArgTs>
     51 class MockAnalysisHandleBase {
     52 public:
     53   class Analysis : public AnalysisInfoMixin<Analysis> {
     54     friend AnalysisInfoMixin<Analysis>;
     55     friend MockAnalysisHandleBase;
     56     static AnalysisKey Key;
     57 
     58     DerivedT *Handle;
     59 
     60     Analysis(DerivedT &Handle) : Handle(&Handle) {
     61       static_assert(std::is_base_of<MockAnalysisHandleBase, DerivedT>::value,
     62                     "Must pass the derived type to this template!");
     63     }
     64 
     65   public:
     66     class Result {
     67       friend MockAnalysisHandleBase;
     68 
     69       DerivedT *Handle;
     70 
     71       Result(DerivedT &Handle) : Handle(&Handle) {}
     72 
     73     public:
     74       // Forward invalidation events to the mock handle.
     75       bool invalidate(IRUnitT &IR, const PreservedAnalyses &PA,
     76                       typename AnalysisManagerT::Invalidator &Inv) {
     77         return Handle->invalidate(IR, PA, Inv);
     78       }
     79     };
     80 
     81     Result run(IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs... ExtraArgs) {
     82       return Handle->run(IR, AM, ExtraArgs...);
     83     }
     84   };
     85 
     86   Analysis getAnalysis() { return Analysis(static_cast<DerivedT &>(*this)); }
     87   typename Analysis::Result getResult() {
     88     return typename Analysis::Result(static_cast<DerivedT &>(*this));
     89   }
     90 
     91 protected:
     92   // FIXME: MSVC seems unable to handle a lambda argument to Invoke from within
     93   // the template, so we use a boring static function.
     94   static bool invalidateCallback(IRUnitT &IR, const PreservedAnalyses &PA,
     95                                  typename AnalysisManagerT::Invalidator &Inv) {
     96     auto PAC = PA.template getChecker<Analysis>();
     97     return !PAC.preserved() &&
     98            !PAC.template preservedSet<AllAnalysesOn<IRUnitT>>();
     99   }
    100 
    101   /// Derived classes should call this in their constructor to set up default
    102   /// mock actions. (We can't do this in our constructor because this has to
    103   /// run after the DerivedT is constructed.)
    104   void setDefaults() {
    105     ON_CALL(static_cast<DerivedT &>(*this),
    106             run(_, _, testing::Matcher<ExtraArgTs>(_)...))
    107         .WillByDefault(Return(this->getResult()));
    108     ON_CALL(static_cast<DerivedT &>(*this), invalidate(_, _, _))
    109         .WillByDefault(Invoke(&invalidateCallback));
    110   }
    111 };
    112 
    113 template <typename DerivedT, typename IRUnitT, typename AnalysisManagerT,
    114           typename... ExtraArgTs>
    115 AnalysisKey MockAnalysisHandleBase<DerivedT, IRUnitT, AnalysisManagerT,
    116                                    ExtraArgTs...>::Analysis::Key;
    117 
    118 /// Mock handle for loop analyses.
    119 ///
    120 /// This is provided as a template accepting an (optional) integer. Because
    121 /// analyses are identified and queried by type, this allows constructing
    122 /// multiple handles with distinctly typed nested 'Analysis' types that can be
    123 /// registered and queried. If you want to register multiple loop analysis
    124 /// passes, you'll need to instantiate this type with different values for I.
    125 /// For example:
    126 ///
    127 ///   MockLoopAnalysisHandleTemplate<0> h0;
    128 ///   MockLoopAnalysisHandleTemplate<1> h1;
    129 ///   typedef decltype(h0)::Analysis Analysis0;
    130 ///   typedef decltype(h1)::Analysis Analysis1;
    131 template <size_t I = static_cast<size_t>(-1)>
    132 struct MockLoopAnalysisHandleTemplate
    133     : MockAnalysisHandleBase<MockLoopAnalysisHandleTemplate<I>, Loop,
    134                              LoopAnalysisManager,
    135                              LoopStandardAnalysisResults &> {
    136   typedef typename MockLoopAnalysisHandleTemplate::Analysis Analysis;
    137 
    138   MOCK_METHOD3_T(run, typename Analysis::Result(Loop &, LoopAnalysisManager &,
    139                                                 LoopStandardAnalysisResults &));
    140 
    141   MOCK_METHOD3_T(invalidate, bool(Loop &, const PreservedAnalyses &,
    142                                   LoopAnalysisManager::Invalidator &));
    143 
    144   MockLoopAnalysisHandleTemplate() { this->setDefaults(); }
    145 };
    146 
    147 typedef MockLoopAnalysisHandleTemplate<> MockLoopAnalysisHandle;
    148 
    149 struct MockFunctionAnalysisHandle
    150     : MockAnalysisHandleBase<MockFunctionAnalysisHandle, Function> {
    151   MOCK_METHOD2(run, Analysis::Result(Function &, FunctionAnalysisManager &));
    152 
    153   MOCK_METHOD3(invalidate, bool(Function &, const PreservedAnalyses &,
    154                                 FunctionAnalysisManager::Invalidator &));
    155 
    156   MockFunctionAnalysisHandle() { setDefaults(); }
    157 };
    158 
    159 template <typename DerivedT, typename IRUnitT,
    160           typename AnalysisManagerT = AnalysisManager<IRUnitT>,
    161           typename... ExtraArgTs>
    162 class MockPassHandleBase {
    163 public:
    164   class Pass : public PassInfoMixin<Pass> {
    165     friend MockPassHandleBase;
    166 
    167     DerivedT *Handle;
    168 
    169     Pass(DerivedT &Handle) : Handle(&Handle) {
    170       static_assert(std::is_base_of<MockPassHandleBase, DerivedT>::value,
    171                     "Must pass the derived type to this template!");
    172     }
    173 
    174   public:
    175     PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM,
    176                           ExtraArgTs... ExtraArgs) {
    177       return Handle->run(IR, AM, ExtraArgs...);
    178     }
    179   };
    180 
    181   Pass getPass() { return Pass(static_cast<DerivedT &>(*this)); }
    182 
    183 protected:
    184   /// Derived classes should call this in their constructor to set up default
    185   /// mock actions. (We can't do this in our constructor because this has to
    186   /// run after the DerivedT is constructed.)
    187   void setDefaults() {
    188     ON_CALL(static_cast<DerivedT &>(*this),
    189             run(_, _, testing::Matcher<ExtraArgTs>(_)...))
    190         .WillByDefault(Return(PreservedAnalyses::all()));
    191   }
    192 };
    193 
    194 struct MockLoopPassHandle
    195     : MockPassHandleBase<MockLoopPassHandle, Loop, LoopAnalysisManager,
    196                          LoopStandardAnalysisResults &, LPMUpdater &> {
    197   MOCK_METHOD4(run,
    198                PreservedAnalyses(Loop &, LoopAnalysisManager &,
    199                                  LoopStandardAnalysisResults &, LPMUpdater &));
    200   MockLoopPassHandle() { setDefaults(); }
    201 };
    202 
    203 struct MockFunctionPassHandle
    204     : MockPassHandleBase<MockFunctionPassHandle, Function> {
    205   MOCK_METHOD2(run, PreservedAnalyses(Function &, FunctionAnalysisManager &));
    206 
    207   MockFunctionPassHandle() { setDefaults(); }
    208 };
    209 
    210 struct MockModulePassHandle : MockPassHandleBase<MockModulePassHandle, Module> {
    211   MOCK_METHOD2(run, PreservedAnalyses(Module &, ModuleAnalysisManager &));
    212 
    213   MockModulePassHandle() { setDefaults(); }
    214 };
    215 
    216 /// Define a custom matcher for objects which support a 'getName' method
    217 /// returning a StringRef.
    218 ///
    219 /// LLVM often has IR objects or analysis objects which expose a StringRef name
    220 /// and in tests it is convenient to match these by name for readability. This
    221 /// matcher supports any type exposing a getName() method of this form.
    222 ///
    223 /// It should be used as:
    224 ///
    225 ///   HasName("my_function")
    226 ///
    227 /// No namespace or other qualification is required.
    228 MATCHER_P(HasName, Name, "") {
    229   // The matcher's name and argument are printed in the case of failure, but we
    230   // also want to print out the name of the argument. This uses an implicitly
    231   // avaiable std::ostream, so we have to construct a std::string.
    232   *result_listener << "has name '" << arg.getName().str() << "'";
    233   return Name == arg.getName();
    234 }
    235 
    236 std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) {
    237   SMDiagnostic Err;
    238   return parseAssemblyString(IR, Err, C);
    239 }
    240 
    241 class LoopPassManagerTest : public ::testing::Test {
    242 protected:
    243   LLVMContext Context;
    244   std::unique_ptr<Module> M;
    245 
    246   LoopAnalysisManager LAM;
    247   FunctionAnalysisManager FAM;
    248   ModuleAnalysisManager MAM;
    249 
    250   MockLoopAnalysisHandle MLAHandle;
    251   MockLoopPassHandle MLPHandle;
    252   MockFunctionPassHandle MFPHandle;
    253   MockModulePassHandle MMPHandle;
    254 
    255   static PreservedAnalyses
    256   getLoopAnalysisResult(Loop &L, LoopAnalysisManager &AM,
    257                         LoopStandardAnalysisResults &AR, LPMUpdater &) {
    258     (void)AM.getResult<MockLoopAnalysisHandle::Analysis>(L, AR);
    259     return PreservedAnalyses::all();
    260   };
    261 
    262 public:
    263   LoopPassManagerTest()
    264       : M(parseIR(Context,
    265                   "define void @f(i1* %ptr) {\n"
    266                   "entry:\n"
    267                   "  br label %loop.0\n"
    268                   "loop.0:\n"
    269                   "  %cond.0 = load volatile i1, i1* %ptr\n"
    270                   "  br i1 %cond.0, label %loop.0.0.ph, label %end\n"
    271                   "loop.0.0.ph:\n"
    272                   "  br label %loop.0.0\n"
    273                   "loop.0.0:\n"
    274                   "  %cond.0.0 = load volatile i1, i1* %ptr\n"
    275                   "  br i1 %cond.0.0, label %loop.0.0, label %loop.0.1.ph\n"
    276                   "loop.0.1.ph:\n"
    277                   "  br label %loop.0.1\n"
    278                   "loop.0.1:\n"
    279                   "  %cond.0.1 = load volatile i1, i1* %ptr\n"
    280                   "  br i1 %cond.0.1, label %loop.0.1, label %loop.0.latch\n"
    281                   "loop.0.latch:\n"
    282                   "  br label %loop.0\n"
    283                   "end:\n"
    284                   "  ret void\n"
    285                   "}\n"
    286                   "\n"
    287                   "define void @g(i1* %ptr) {\n"
    288                   "entry:\n"
    289                   "  br label %loop.g.0\n"
    290                   "loop.g.0:\n"
    291                   "  %cond.0 = load volatile i1, i1* %ptr\n"
    292                   "  br i1 %cond.0, label %loop.g.0, label %end\n"
    293                   "end:\n"
    294                   "  ret void\n"
    295                   "}\n")),
    296         LAM(true), FAM(true), MAM(true) {
    297     // Register our mock analysis.
    298     LAM.registerPass([&] { return MLAHandle.getAnalysis(); });
    299 
    300     // We need DominatorTreeAnalysis for LoopAnalysis.
    301     FAM.registerPass([&] { return DominatorTreeAnalysis(); });
    302     FAM.registerPass([&] { return LoopAnalysis(); });
    303     // We also allow loop passes to assume a set of other analyses and so need
    304     // those.
    305     FAM.registerPass([&] { return AAManager(); });
    306     FAM.registerPass([&] { return AssumptionAnalysis(); });
    307     FAM.registerPass([&] { return ScalarEvolutionAnalysis(); });
    308     FAM.registerPass([&] { return TargetLibraryAnalysis(); });
    309     FAM.registerPass([&] { return TargetIRAnalysis(); });
    310 
    311     // Cross-register proxies.
    312     LAM.registerPass([&] { return FunctionAnalysisManagerLoopProxy(FAM); });
    313     FAM.registerPass([&] { return LoopAnalysisManagerFunctionProxy(LAM); });
    314     FAM.registerPass([&] { return ModuleAnalysisManagerFunctionProxy(MAM); });
    315     MAM.registerPass([&] { return FunctionAnalysisManagerModuleProxy(FAM); });
    316   }
    317 };
    318 
    319 TEST_F(LoopPassManagerTest, Basic) {
    320   ModulePassManager MPM(true);
    321   ::testing::InSequence MakeExpectationsSequenced;
    322 
    323   // First we just visit all the loops in all the functions and get their
    324   // analysis results. This will run the analysis a total of four times,
    325   // once for each loop.
    326   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
    327       .WillOnce(Invoke(getLoopAnalysisResult));
    328   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    329   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1"), _, _, _))
    330       .WillOnce(Invoke(getLoopAnalysisResult));
    331   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    332   EXPECT_CALL(MLPHandle, run(HasName("loop.0"), _, _, _))
    333       .WillOnce(Invoke(getLoopAnalysisResult));
    334   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    335   EXPECT_CALL(MLPHandle, run(HasName("loop.g.0"), _, _, _))
    336       .WillOnce(Invoke(getLoopAnalysisResult));
    337   EXPECT_CALL(MLAHandle, run(HasName("loop.g.0"), _, _));
    338   // Wire the loop pass through pass managers into the module pipeline.
    339   {
    340     LoopPassManager LPM(true);
    341     LPM.addPass(MLPHandle.getPass());
    342     FunctionPassManager FPM(true);
    343     FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM)));
    344     MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
    345   }
    346 
    347   // Next we run two passes over the loops. The first one invalidates the
    348   // analyses for one loop, the second ones try to get the analysis results.
    349   // This should force only one analysis to re-run within the loop PM, but will
    350   // also invalidate everything after the loop pass manager finishes.
    351   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
    352       .WillOnce(DoDefault())
    353       .WillOnce(Invoke(getLoopAnalysisResult));
    354   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1"), _, _, _))
    355       .WillOnce(InvokeWithoutArgs([] { return PreservedAnalyses::none(); }))
    356       .WillOnce(Invoke(getLoopAnalysisResult));
    357   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    358   EXPECT_CALL(MLPHandle, run(HasName("loop.0"), _, _, _))
    359       .WillOnce(DoDefault())
    360       .WillOnce(Invoke(getLoopAnalysisResult));
    361   EXPECT_CALL(MLPHandle, run(HasName("loop.g.0"), _, _, _))
    362       .WillOnce(DoDefault())
    363       .WillOnce(Invoke(getLoopAnalysisResult));
    364   // Wire two loop pass runs into the module pipeline.
    365   {
    366     LoopPassManager LPM(true);
    367     LPM.addPass(MLPHandle.getPass());
    368     LPM.addPass(MLPHandle.getPass());
    369     FunctionPassManager FPM(true);
    370     FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM)));
    371     MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
    372   }
    373 
    374   // And now run the pipeline across the module.
    375   MPM.run(*M, MAM);
    376 }
    377 
    378 TEST_F(LoopPassManagerTest, FunctionPassInvalidationOfLoopAnalyses) {
    379   ModulePassManager MPM(true);
    380   FunctionPassManager FPM(true);
    381   // We process each function completely in sequence.
    382   ::testing::Sequence FSequence, GSequence;
    383 
    384   // First, force the analysis result to be computed for each loop.
    385   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _))
    386       .InSequence(FSequence)
    387       .WillOnce(DoDefault());
    388   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _))
    389       .InSequence(FSequence)
    390       .WillOnce(DoDefault());
    391   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _))
    392       .InSequence(FSequence)
    393       .WillOnce(DoDefault());
    394   EXPECT_CALL(MLAHandle, run(HasName("loop.g.0"), _, _))
    395       .InSequence(GSequence)
    396       .WillOnce(DoDefault());
    397   FPM.addPass(createFunctionToLoopPassAdaptor(
    398       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
    399 
    400   // No need to re-run if we require again from a fresh loop pass manager.
    401   FPM.addPass(createFunctionToLoopPassAdaptor(
    402       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
    403 
    404   // For 'f', preserve most things but not the specific loop analyses.
    405   EXPECT_CALL(MFPHandle, run(HasName("f"), _))
    406       .InSequence(FSequence)
    407       .WillOnce(Return(getLoopPassPreservedAnalyses()));
    408   EXPECT_CALL(MLAHandle, invalidate(HasName("loop.0.0"), _, _))
    409       .InSequence(FSequence)
    410       .WillOnce(DoDefault());
    411   // On one loop, skip the invalidation (as though we did an internal update).
    412   EXPECT_CALL(MLAHandle, invalidate(HasName("loop.0.1"), _, _))
    413       .InSequence(FSequence)
    414       .WillOnce(Return(false));
    415   EXPECT_CALL(MLAHandle, invalidate(HasName("loop.0"), _, _))
    416       .InSequence(FSequence)
    417       .WillOnce(DoDefault());
    418   // Now two loops still have to be recomputed.
    419   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _))
    420       .InSequence(FSequence)
    421       .WillOnce(DoDefault());
    422   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _))
    423       .InSequence(FSequence)
    424       .WillOnce(DoDefault());
    425   // Preserve things in the second function to ensure invalidation remains
    426   // isolated to one function.
    427   EXPECT_CALL(MFPHandle, run(HasName("g"), _))
    428       .InSequence(GSequence)
    429       .WillOnce(DoDefault());
    430   FPM.addPass(MFPHandle.getPass());
    431   FPM.addPass(createFunctionToLoopPassAdaptor(
    432       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
    433 
    434   EXPECT_CALL(MFPHandle, run(HasName("f"), _))
    435       .InSequence(FSequence)
    436       .WillOnce(DoDefault());
    437   // For 'g', fail to preserve anything, causing the loops themselves to be
    438   // cleared. We don't get an invalidation event here as the loop is gone, but
    439   // we should still have to recompute the analysis.
    440   EXPECT_CALL(MFPHandle, run(HasName("g"), _))
    441       .InSequence(GSequence)
    442       .WillOnce(Return(PreservedAnalyses::none()));
    443   EXPECT_CALL(MLAHandle, run(HasName("loop.g.0"), _, _))
    444       .InSequence(GSequence)
    445       .WillOnce(DoDefault());
    446   FPM.addPass(MFPHandle.getPass());
    447   FPM.addPass(createFunctionToLoopPassAdaptor(
    448       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
    449 
    450   MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
    451 
    452   // Verify with a separate function pass run that we didn't mess up 'f's
    453   // cache. No analysis runs should be necessary here.
    454   MPM.addPass(createModuleToFunctionPassAdaptor(createFunctionToLoopPassAdaptor(
    455       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>())));
    456 
    457   MPM.run(*M, MAM);
    458 }
    459 
    460 TEST_F(LoopPassManagerTest, ModulePassInvalidationOfLoopAnalyses) {
    461   ModulePassManager MPM(true);
    462   ::testing::InSequence MakeExpectationsSequenced;
    463 
    464   // First, force the analysis result to be computed for each loop.
    465   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    466   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    467   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    468   EXPECT_CALL(MLAHandle, run(HasName("loop.g.0"), _, _));
    469   MPM.addPass(createModuleToFunctionPassAdaptor(createFunctionToLoopPassAdaptor(
    470       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>())));
    471 
    472   // Walking all the way out and all the way back in doesn't re-run the
    473   // analysis.
    474   MPM.addPass(createModuleToFunctionPassAdaptor(createFunctionToLoopPassAdaptor(
    475       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>())));
    476 
    477   // But a module pass that doesn't preserve the actual mock loop analysis
    478   // invalidates all the way down and forces recomputing.
    479   EXPECT_CALL(MMPHandle, run(_, _)).WillOnce(InvokeWithoutArgs([] {
    480     auto PA = getLoopPassPreservedAnalyses();
    481     PA.preserve<FunctionAnalysisManagerModuleProxy>();
    482     return PA;
    483   }));
    484   // All the loop analyses from both functions get invalidated before we
    485   // recompute anything.
    486   EXPECT_CALL(MLAHandle, invalidate(HasName("loop.0.0"), _, _));
    487   // On one loop, again skip the invalidation (as though we did an internal
    488   // update).
    489   EXPECT_CALL(MLAHandle, invalidate(HasName("loop.0.1"), _, _))
    490       .WillOnce(Return(false));
    491   EXPECT_CALL(MLAHandle, invalidate(HasName("loop.0"), _, _));
    492   EXPECT_CALL(MLAHandle, invalidate(HasName("loop.g.0"), _, _));
    493   // Now all but one of the loops gets re-analyzed.
    494   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    495   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    496   EXPECT_CALL(MLAHandle, run(HasName("loop.g.0"), _, _));
    497   MPM.addPass(MMPHandle.getPass());
    498   MPM.addPass(createModuleToFunctionPassAdaptor(createFunctionToLoopPassAdaptor(
    499       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>())));
    500 
    501   // Verify that the cached values persist.
    502   MPM.addPass(createModuleToFunctionPassAdaptor(createFunctionToLoopPassAdaptor(
    503       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>())));
    504 
    505   // Now we fail to preserve the loop analysis and observe that the loop
    506   // analyses are cleared (so no invalidation event) as the loops themselves
    507   // are no longer valid.
    508   EXPECT_CALL(MMPHandle, run(_, _)).WillOnce(InvokeWithoutArgs([] {
    509     auto PA = PreservedAnalyses::none();
    510     PA.preserve<FunctionAnalysisManagerModuleProxy>();
    511     return PA;
    512   }));
    513   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    514   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    515   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    516   EXPECT_CALL(MLAHandle, run(HasName("loop.g.0"), _, _));
    517   MPM.addPass(MMPHandle.getPass());
    518   MPM.addPass(createModuleToFunctionPassAdaptor(createFunctionToLoopPassAdaptor(
    519       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>())));
    520 
    521   // Verify that the cached values persist.
    522   MPM.addPass(createModuleToFunctionPassAdaptor(createFunctionToLoopPassAdaptor(
    523       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>())));
    524 
    525   // Next, check that even if we preserve everything within the function itelf,
    526   // if the function's module pass proxy isn't preserved and the potential set
    527   // of functions changes, the clear reaches the loop analyses as well. This
    528   // will again trigger re-runs but not invalidation events.
    529   EXPECT_CALL(MMPHandle, run(_, _)).WillOnce(InvokeWithoutArgs([] {
    530     auto PA = PreservedAnalyses::none();
    531     PA.preserveSet<AllAnalysesOn<Function>>();
    532     PA.preserveSet<AllAnalysesOn<Loop>>();
    533     return PA;
    534   }));
    535   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    536   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    537   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    538   EXPECT_CALL(MLAHandle, run(HasName("loop.g.0"), _, _));
    539   MPM.addPass(MMPHandle.getPass());
    540   MPM.addPass(createModuleToFunctionPassAdaptor(createFunctionToLoopPassAdaptor(
    541       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>())));
    542 
    543   MPM.run(*M, MAM);
    544 }
    545 
    546 // Test that if any of the bundled analyses provided in the LPM's signature
    547 // become invalid, the analysis proxy itself becomes invalid and we clear all
    548 // loop analysis results.
    549 TEST_F(LoopPassManagerTest, InvalidationOfBundledAnalyses) {
    550   ModulePassManager MPM(true);
    551   FunctionPassManager FPM(true);
    552   ::testing::InSequence MakeExpectationsSequenced;
    553 
    554   // First, force the analysis result to be computed for each loop.
    555   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    556   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    557   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    558   FPM.addPass(createFunctionToLoopPassAdaptor(
    559       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
    560 
    561   // No need to re-run if we require again from a fresh loop pass manager.
    562   FPM.addPass(createFunctionToLoopPassAdaptor(
    563       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
    564 
    565   // Preserving everything but the loop analyses themselves results in
    566   // invalidation and running.
    567   EXPECT_CALL(MFPHandle, run(HasName("f"), _))
    568       .WillOnce(Return(getLoopPassPreservedAnalyses()));
    569   EXPECT_CALL(MLAHandle, invalidate(_, _, _)).Times(3);
    570   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    571   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    572   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    573   FPM.addPass(MFPHandle.getPass());
    574   FPM.addPass(createFunctionToLoopPassAdaptor(
    575       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
    576 
    577   // The rest don't invalidate analyses, they only trigger re-runs because we
    578   // clear the cache completely.
    579   EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
    580     auto PA = PreservedAnalyses::none();
    581     // Not preserving `AAManager`.
    582     PA.preserve<DominatorTreeAnalysis>();
    583     PA.preserve<LoopAnalysis>();
    584     PA.preserve<LoopAnalysisManagerFunctionProxy>();
    585     PA.preserve<ScalarEvolutionAnalysis>();
    586     return PA;
    587   }));
    588   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    589   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    590   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    591   FPM.addPass(MFPHandle.getPass());
    592   FPM.addPass(createFunctionToLoopPassAdaptor(
    593       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
    594 
    595   EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
    596     auto PA = PreservedAnalyses::none();
    597     PA.preserve<AAManager>();
    598     // Not preserving `DominatorTreeAnalysis`.
    599     PA.preserve<LoopAnalysis>();
    600     PA.preserve<LoopAnalysisManagerFunctionProxy>();
    601     PA.preserve<ScalarEvolutionAnalysis>();
    602     return PA;
    603   }));
    604   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    605   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    606   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    607   FPM.addPass(MFPHandle.getPass());
    608   FPM.addPass(createFunctionToLoopPassAdaptor(
    609       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
    610 
    611   EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
    612     auto PA = PreservedAnalyses::none();
    613     PA.preserve<AAManager>();
    614     PA.preserve<DominatorTreeAnalysis>();
    615     // Not preserving the `LoopAnalysis`.
    616     PA.preserve<LoopAnalysisManagerFunctionProxy>();
    617     PA.preserve<ScalarEvolutionAnalysis>();
    618     return PA;
    619   }));
    620   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    621   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    622   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    623   FPM.addPass(MFPHandle.getPass());
    624   FPM.addPass(createFunctionToLoopPassAdaptor(
    625       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
    626 
    627   EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
    628     auto PA = PreservedAnalyses::none();
    629     PA.preserve<AAManager>();
    630     PA.preserve<DominatorTreeAnalysis>();
    631     PA.preserve<LoopAnalysis>();
    632     // Not preserving the `LoopAnalysisManagerFunctionProxy`.
    633     PA.preserve<ScalarEvolutionAnalysis>();
    634     return PA;
    635   }));
    636   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    637   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    638   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    639   FPM.addPass(MFPHandle.getPass());
    640   FPM.addPass(createFunctionToLoopPassAdaptor(
    641       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
    642 
    643   EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
    644     auto PA = PreservedAnalyses::none();
    645     PA.preserve<AAManager>();
    646     PA.preserve<DominatorTreeAnalysis>();
    647     PA.preserve<LoopAnalysis>();
    648     PA.preserve<LoopAnalysisManagerFunctionProxy>();
    649     // Not preserving `ScalarEvolutionAnalysis`.
    650     return PA;
    651   }));
    652   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    653   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    654   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    655   FPM.addPass(MFPHandle.getPass());
    656   FPM.addPass(createFunctionToLoopPassAdaptor(
    657       RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
    658 
    659   // After all the churn on 'f', we'll compute the loop analysis results for
    660   // 'g' once with a requires pass and then run our mock pass over g a bunch
    661   // but just get cached results each time.
    662   EXPECT_CALL(MLAHandle, run(HasName("loop.g.0"), _, _));
    663   EXPECT_CALL(MFPHandle, run(HasName("g"), _)).Times(6);
    664 
    665   MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
    666   MPM.run(*M, MAM);
    667 }
    668 
    669 TEST_F(LoopPassManagerTest, IndirectInvalidation) {
    670   // We need two distinct analysis types and handles.
    671   enum { A, B };
    672   MockLoopAnalysisHandleTemplate<A> MLAHandleA;
    673   MockLoopAnalysisHandleTemplate<B> MLAHandleB;
    674   LAM.registerPass([&] { return MLAHandleA.getAnalysis(); });
    675   LAM.registerPass([&] { return MLAHandleB.getAnalysis(); });
    676   typedef decltype(MLAHandleA)::Analysis AnalysisA;
    677   typedef decltype(MLAHandleB)::Analysis AnalysisB;
    678 
    679   // Set up AnalysisA to depend on our AnalysisB. For testing purposes we just
    680   // need to get the AnalysisB results in AnalysisA's run method and check if
    681   // AnalysisB gets invalidated in AnalysisA's invalidate method.
    682   ON_CALL(MLAHandleA, run(_, _, _))
    683       .WillByDefault(Invoke([&](Loop &L, LoopAnalysisManager &AM,
    684                                 LoopStandardAnalysisResults &AR) {
    685         (void)AM.getResult<AnalysisB>(L, AR);
    686         return MLAHandleA.getResult();
    687       }));
    688   ON_CALL(MLAHandleA, invalidate(_, _, _))
    689       .WillByDefault(Invoke([](Loop &L, const PreservedAnalyses &PA,
    690                                LoopAnalysisManager::Invalidator &Inv) {
    691         auto PAC = PA.getChecker<AnalysisA>();
    692         return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Loop>>()) ||
    693                Inv.invalidate<AnalysisB>(L, PA);
    694       }));
    695 
    696   ::testing::InSequence MakeExpectationsSequenced;
    697 
    698   // Compute the analyses across all of 'f' first.
    699   EXPECT_CALL(MLAHandleA, run(HasName("loop.0.0"), _, _));
    700   EXPECT_CALL(MLAHandleB, run(HasName("loop.0.0"), _, _));
    701   EXPECT_CALL(MLAHandleA, run(HasName("loop.0.1"), _, _));
    702   EXPECT_CALL(MLAHandleB, run(HasName("loop.0.1"), _, _));
    703   EXPECT_CALL(MLAHandleA, run(HasName("loop.0"), _, _));
    704   EXPECT_CALL(MLAHandleB, run(HasName("loop.0"), _, _));
    705 
    706   // Now we invalidate AnalysisB (but not AnalysisA) for one of the loops and
    707   // preserve everything for the rest. This in turn triggers that one loop to
    708   // recompute both AnalysisB *and* AnalysisA if indirect invalidation is
    709   // working.
    710   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
    711       .WillOnce(InvokeWithoutArgs([] {
    712         auto PA = getLoopPassPreservedAnalyses();
    713         // Specifically preserve AnalysisA so that it would survive if it
    714         // didn't depend on AnalysisB.
    715         PA.preserve<AnalysisA>();
    716         return PA;
    717       }));
    718   // It happens that AnalysisB is invalidated first. That shouldn't matter
    719   // though, and we should still call AnalysisA's invalidation.
    720   EXPECT_CALL(MLAHandleB, invalidate(HasName("loop.0.0"), _, _));
    721   EXPECT_CALL(MLAHandleA, invalidate(HasName("loop.0.0"), _, _));
    722   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
    723       .WillOnce(Invoke([](Loop &L, LoopAnalysisManager &AM,
    724                           LoopStandardAnalysisResults &AR, LPMUpdater &) {
    725         (void)AM.getResult<AnalysisA>(L, AR);
    726         return PreservedAnalyses::all();
    727       }));
    728   EXPECT_CALL(MLAHandleA, run(HasName("loop.0.0"), _, _));
    729   EXPECT_CALL(MLAHandleB, run(HasName("loop.0.0"), _, _));
    730   // The rest of the loops should run and get cached results.
    731   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1"), _, _, _))
    732       .Times(2)
    733       .WillRepeatedly(Invoke([](Loop &L, LoopAnalysisManager &AM,
    734                                 LoopStandardAnalysisResults &AR, LPMUpdater &) {
    735         (void)AM.getResult<AnalysisA>(L, AR);
    736         return PreservedAnalyses::all();
    737       }));
    738   EXPECT_CALL(MLPHandle, run(HasName("loop.0"), _, _, _))
    739       .Times(2)
    740       .WillRepeatedly(Invoke([](Loop &L, LoopAnalysisManager &AM,
    741                                 LoopStandardAnalysisResults &AR, LPMUpdater &) {
    742         (void)AM.getResult<AnalysisA>(L, AR);
    743         return PreservedAnalyses::all();
    744       }));
    745 
    746   // The run over 'g' should be boring, with us just computing the analyses once
    747   // up front and then running loop passes and getting cached results.
    748   EXPECT_CALL(MLAHandleA, run(HasName("loop.g.0"), _, _));
    749   EXPECT_CALL(MLAHandleB, run(HasName("loop.g.0"), _, _));
    750   EXPECT_CALL(MLPHandle, run(HasName("loop.g.0"), _, _, _))
    751       .Times(2)
    752       .WillRepeatedly(Invoke([](Loop &L, LoopAnalysisManager &AM,
    753                                 LoopStandardAnalysisResults &AR, LPMUpdater &) {
    754         (void)AM.getResult<AnalysisA>(L, AR);
    755         return PreservedAnalyses::all();
    756       }));
    757 
    758   // Build the pipeline and run it.
    759   ModulePassManager MPM(true);
    760   FunctionPassManager FPM(true);
    761   FPM.addPass(
    762       createFunctionToLoopPassAdaptor(RequireAnalysisLoopPass<AnalysisA>()));
    763   LoopPassManager LPM(true);
    764   LPM.addPass(MLPHandle.getPass());
    765   LPM.addPass(MLPHandle.getPass());
    766   FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM)));
    767   MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
    768   MPM.run(*M, MAM);
    769 }
    770 
    771 TEST_F(LoopPassManagerTest, IndirectOuterPassInvalidation) {
    772   typedef decltype(MLAHandle)::Analysis LoopAnalysis;
    773 
    774   MockFunctionAnalysisHandle MFAHandle;
    775   FAM.registerPass([&] { return MFAHandle.getAnalysis(); });
    776   typedef decltype(MFAHandle)::Analysis FunctionAnalysis;
    777 
    778   // Set up the loop analysis to depend on both the function and module
    779   // analysis.
    780   ON_CALL(MLAHandle, run(_, _, _))
    781       .WillByDefault(Invoke([&](Loop &L, LoopAnalysisManager &AM,
    782                                 LoopStandardAnalysisResults &AR) {
    783         auto &FAMP = AM.getResult<FunctionAnalysisManagerLoopProxy>(L, AR);
    784         auto &FAM = FAMP.getManager();
    785         Function &F = *L.getHeader()->getParent();
    786         if (FAM.getCachedResult<FunctionAnalysis>(F))
    787           FAMP.registerOuterAnalysisInvalidation<FunctionAnalysis,
    788                                                  LoopAnalysis>();
    789         return MLAHandle.getResult();
    790       }));
    791 
    792   ::testing::InSequence MakeExpectationsSequenced;
    793 
    794   // Compute the analyses across all of 'f' first.
    795   EXPECT_CALL(MFPHandle, run(HasName("f"), _))
    796       .WillOnce(Invoke([](Function &F, FunctionAnalysisManager &AM) {
    797         // Force the computing of the function analysis so it is available in
    798         // this function.
    799         (void)AM.getResult<FunctionAnalysis>(F);
    800         return PreservedAnalyses::all();
    801       }));
    802   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    803   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    804   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    805 
    806   // Now invalidate the function analysis but preserve the loop analyses.
    807   // This should trigger immediate invalidation of the loop analyses, despite
    808   // the fact that they were preserved.
    809   EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
    810     auto PA = getLoopPassPreservedAnalyses();
    811     PA.preserveSet<AllAnalysesOn<Loop>>();
    812     return PA;
    813   }));
    814   EXPECT_CALL(MLAHandle, invalidate(HasName("loop.0.0"), _, _));
    815   EXPECT_CALL(MLAHandle, invalidate(HasName("loop.0.1"), _, _));
    816   EXPECT_CALL(MLAHandle, invalidate(HasName("loop.0"), _, _));
    817 
    818   // And re-running a requires pass recomputes them.
    819   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    820   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    821   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
    822 
    823   // When we run over 'g' we don't populate the cache with the function
    824   // analysis.
    825   EXPECT_CALL(MFPHandle, run(HasName("g"), _))
    826       .WillOnce(Return(PreservedAnalyses::all()));
    827   EXPECT_CALL(MLAHandle, run(HasName("loop.g.0"), _, _));
    828 
    829   // Which means that no extra invalidation occurs and cached values are used.
    830   EXPECT_CALL(MFPHandle, run(HasName("g"), _)).WillOnce(InvokeWithoutArgs([] {
    831     auto PA = getLoopPassPreservedAnalyses();
    832     PA.preserveSet<AllAnalysesOn<Loop>>();
    833     return PA;
    834   }));
    835 
    836   // Build the pipeline and run it.
    837   ModulePassManager MPM(true);
    838   FunctionPassManager FPM(true);
    839   FPM.addPass(MFPHandle.getPass());
    840   FPM.addPass(
    841       createFunctionToLoopPassAdaptor(RequireAnalysisLoopPass<LoopAnalysis>()));
    842   FPM.addPass(MFPHandle.getPass());
    843   FPM.addPass(
    844       createFunctionToLoopPassAdaptor(RequireAnalysisLoopPass<LoopAnalysis>()));
    845   MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
    846   MPM.run(*M, MAM);
    847 }
    848 
    849 TEST_F(LoopPassManagerTest, LoopChildInsertion) {
    850   // Super boring module with three loops in a single loop nest.
    851   M = parseIR(Context, "define void @f(i1* %ptr) {\n"
    852                        "entry:\n"
    853                        "  br label %loop.0\n"
    854                        "loop.0:\n"
    855                        "  %cond.0 = load volatile i1, i1* %ptr\n"
    856                        "  br i1 %cond.0, label %loop.0.0.ph, label %end\n"
    857                        "loop.0.0.ph:\n"
    858                        "  br label %loop.0.0\n"
    859                        "loop.0.0:\n"
    860                        "  %cond.0.0 = load volatile i1, i1* %ptr\n"
    861                        "  br i1 %cond.0.0, label %loop.0.0, label %loop.0.1.ph\n"
    862                        "loop.0.1.ph:\n"
    863                        "  br label %loop.0.1\n"
    864                        "loop.0.1:\n"
    865                        "  %cond.0.1 = load volatile i1, i1* %ptr\n"
    866                        "  br i1 %cond.0.1, label %loop.0.1, label %loop.0.2.ph\n"
    867                        "loop.0.2.ph:\n"
    868                        "  br label %loop.0.2\n"
    869                        "loop.0.2:\n"
    870                        "  %cond.0.2 = load volatile i1, i1* %ptr\n"
    871                        "  br i1 %cond.0.2, label %loop.0.2, label %loop.0.latch\n"
    872                        "loop.0.latch:\n"
    873                        "  br label %loop.0\n"
    874                        "end:\n"
    875                        "  ret void\n"
    876                        "}\n");
    877 
    878   // Build up variables referring into the IR so we can rewrite it below
    879   // easily.
    880   Function &F = *M->begin();
    881   ASSERT_THAT(F, HasName("f"));
    882   Argument &Ptr = *F.arg_begin();
    883   auto BBI = F.begin();
    884   BasicBlock &EntryBB = *BBI++;
    885   ASSERT_THAT(EntryBB, HasName("entry"));
    886   BasicBlock &Loop0BB = *BBI++;
    887   ASSERT_THAT(Loop0BB, HasName("loop.0"));
    888   BasicBlock &Loop00PHBB = *BBI++;
    889   ASSERT_THAT(Loop00PHBB, HasName("loop.0.0.ph"));
    890   BasicBlock &Loop00BB = *BBI++;
    891   ASSERT_THAT(Loop00BB, HasName("loop.0.0"));
    892   BasicBlock &Loop01PHBB = *BBI++;
    893   ASSERT_THAT(Loop01PHBB, HasName("loop.0.1.ph"));
    894   BasicBlock &Loop01BB = *BBI++;
    895   ASSERT_THAT(Loop01BB, HasName("loop.0.1"));
    896   BasicBlock &Loop02PHBB = *BBI++;
    897   ASSERT_THAT(Loop02PHBB, HasName("loop.0.2.ph"));
    898   BasicBlock &Loop02BB = *BBI++;
    899   ASSERT_THAT(Loop02BB, HasName("loop.0.2"));
    900   BasicBlock &Loop0LatchBB = *BBI++;
    901   ASSERT_THAT(Loop0LatchBB, HasName("loop.0.latch"));
    902   BasicBlock &EndBB = *BBI++;
    903   ASSERT_THAT(EndBB, HasName("end"));
    904   ASSERT_THAT(BBI, F.end());
    905   auto CreateCondBr = [&](BasicBlock *TrueBB, BasicBlock *FalseBB,
    906                           const char *Name, BasicBlock *BB) {
    907     auto *Cond = new LoadInst(&Ptr, Name, /*isVolatile*/ true, BB);
    908     BranchInst::Create(TrueBB, FalseBB, Cond, BB);
    909   };
    910 
    911   // Build the pass managers and register our pipeline. We build a single loop
    912   // pass pipeline consisting of three mock pass runs over each loop. After
    913   // this we run both domtree and loop verification passes to make sure that
    914   // the IR remained valid during our mutations.
    915   ModulePassManager MPM(true);
    916   FunctionPassManager FPM(true);
    917   LoopPassManager LPM(true);
    918   LPM.addPass(MLPHandle.getPass());
    919   LPM.addPass(MLPHandle.getPass());
    920   LPM.addPass(MLPHandle.getPass());
    921   FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM)));
    922   FPM.addPass(DominatorTreeVerifierPass());
    923   FPM.addPass(LoopVerifierPass());
    924   MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
    925 
    926   // All the visit orders are deterministic, so we use simple fully order
    927   // expectations.
    928   ::testing::InSequence MakeExpectationsSequenced;
    929 
    930   // We run loop passes three times over each of the loops.
    931   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
    932       .WillOnce(Invoke(getLoopAnalysisResult));
    933   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
    934   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
    935       .Times(2)
    936       .WillRepeatedly(Invoke(getLoopAnalysisResult));
    937 
    938   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1"), _, _, _))
    939       .WillOnce(Invoke(getLoopAnalysisResult));
    940   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
    941 
    942   // When running over the middle loop, the second run inserts two new child
    943   // loops, inserting them and itself into the worklist.
    944   BasicBlock *NewLoop010BB, *NewLoop01LatchBB;
    945   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1"), _, _, _))
    946       .WillOnce(Invoke([&](Loop &L, LoopAnalysisManager &AM,
    947                            LoopStandardAnalysisResults &AR,
    948                            LPMUpdater &Updater) {
    949         auto *NewLoop = AR.LI.AllocateLoop();
    950         L.addChildLoop(NewLoop);
    951         auto *NewLoop010PHBB =
    952             BasicBlock::Create(Context, "loop.0.1.0.ph", &F, &Loop02PHBB);
    953         NewLoop010BB =
    954             BasicBlock::Create(Context, "loop.0.1.0", &F, &Loop02PHBB);
    955         NewLoop01LatchBB =
    956             BasicBlock::Create(Context, "loop.0.1.latch", &F, &Loop02PHBB);
    957         Loop01BB.getTerminator()->replaceUsesOfWith(&Loop01BB, NewLoop010PHBB);
    958         BranchInst::Create(NewLoop010BB, NewLoop010PHBB);
    959         CreateCondBr(NewLoop01LatchBB, NewLoop010BB, "cond.0.1.0",
    960                      NewLoop010BB);
    961         BranchInst::Create(&Loop01BB, NewLoop01LatchBB);
    962         AR.DT.addNewBlock(NewLoop010PHBB, &Loop01BB);
    963         AR.DT.addNewBlock(NewLoop010BB, NewLoop010PHBB);
    964         AR.DT.addNewBlock(NewLoop01LatchBB, NewLoop010BB);
    965         EXPECT_TRUE(AR.DT.verify());
    966         L.addBasicBlockToLoop(NewLoop010PHBB, AR.LI);
    967         NewLoop->addBasicBlockToLoop(NewLoop010BB, AR.LI);
    968         L.addBasicBlockToLoop(NewLoop01LatchBB, AR.LI);
    969         NewLoop->verifyLoop();
    970         L.verifyLoop();
    971         Updater.addChildLoops({NewLoop});
    972         return PreservedAnalyses::all();
    973       }));
    974 
    975   // We should immediately drop down to fully visit the new inner loop.
    976   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1.0"), _, _, _))
    977       .WillOnce(Invoke(getLoopAnalysisResult));
    978   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1.0"), _, _));
    979   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1.0"), _, _, _))
    980       .Times(2)
    981       .WillRepeatedly(Invoke(getLoopAnalysisResult));
    982 
    983   // After visiting the inner loop, we should re-visit the second loop
    984   // reflecting its new loop nest structure.
    985   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1"), _, _, _))
    986       .WillOnce(Invoke(getLoopAnalysisResult));
    987 
    988   // In the second run over the middle loop after we've visited the new child,
    989   // we add another child to check that we can repeatedly add children, and add
    990   // children to a loop that already has children.
    991   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1"), _, _, _))
    992       .WillOnce(Invoke([&](Loop &L, LoopAnalysisManager &AM,
    993                            LoopStandardAnalysisResults &AR,
    994                            LPMUpdater &Updater) {
    995         auto *NewLoop = AR.LI.AllocateLoop();
    996         L.addChildLoop(NewLoop);
    997         auto *NewLoop011PHBB = BasicBlock::Create(Context, "loop.0.1.1.ph", &F, NewLoop01LatchBB);
    998         auto *NewLoop011BB = BasicBlock::Create(Context, "loop.0.1.1", &F, NewLoop01LatchBB);
    999         NewLoop010BB->getTerminator()->replaceUsesOfWith(NewLoop01LatchBB,
   1000                                                          NewLoop011PHBB);
   1001         BranchInst::Create(NewLoop011BB, NewLoop011PHBB);
   1002         CreateCondBr(NewLoop01LatchBB, NewLoop011BB, "cond.0.1.1",
   1003                      NewLoop011BB);
   1004         AR.DT.addNewBlock(NewLoop011PHBB, NewLoop010BB);
   1005         auto *NewDTNode = AR.DT.addNewBlock(NewLoop011BB, NewLoop011PHBB);
   1006         AR.DT.changeImmediateDominator(AR.DT[NewLoop01LatchBB], NewDTNode);
   1007         EXPECT_TRUE(AR.DT.verify());
   1008         L.addBasicBlockToLoop(NewLoop011PHBB, AR.LI);
   1009         NewLoop->addBasicBlockToLoop(NewLoop011BB, AR.LI);
   1010         NewLoop->verifyLoop();
   1011         L.verifyLoop();
   1012         Updater.addChildLoops({NewLoop});
   1013         return PreservedAnalyses::all();
   1014       }));
   1015 
   1016   // Again, we should immediately drop down to visit the new, unvisited child
   1017   // loop. We don't need to revisit the other child though.
   1018   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1.1"), _, _, _))
   1019       .WillOnce(Invoke(getLoopAnalysisResult));
   1020   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1.1"), _, _));
   1021   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1.1"), _, _, _))
   1022       .Times(2)
   1023       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1024 
   1025   // And now we should pop back up to the second loop and do a full pipeline of
   1026   // three passes on its current form.
   1027   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1"), _, _, _))
   1028       .Times(3)
   1029       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1030 
   1031   EXPECT_CALL(MLPHandle, run(HasName("loop.0.2"), _, _, _))
   1032       .WillOnce(Invoke(getLoopAnalysisResult));
   1033   EXPECT_CALL(MLAHandle, run(HasName("loop.0.2"), _, _));
   1034   EXPECT_CALL(MLPHandle, run(HasName("loop.0.2"), _, _, _))
   1035       .Times(2)
   1036       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1037 
   1038   EXPECT_CALL(MLPHandle, run(HasName("loop.0"), _, _, _))
   1039       .WillOnce(Invoke(getLoopAnalysisResult));
   1040   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
   1041   EXPECT_CALL(MLPHandle, run(HasName("loop.0"), _, _, _))
   1042       .Times(2)
   1043       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1044 
   1045   // Now that all the expected actions are registered, run the pipeline over
   1046   // our module. All of our expectations are verified when the test finishes.
   1047   MPM.run(*M, MAM);
   1048 }
   1049 
   1050 TEST_F(LoopPassManagerTest, LoopPeerInsertion) {
   1051   // Super boring module with two loop nests and loop nest with two child
   1052   // loops.
   1053   M = parseIR(Context, "define void @f(i1* %ptr) {\n"
   1054                        "entry:\n"
   1055                        "  br label %loop.0\n"
   1056                        "loop.0:\n"
   1057                        "  %cond.0 = load volatile i1, i1* %ptr\n"
   1058                        "  br i1 %cond.0, label %loop.0.0.ph, label %loop.2.ph\n"
   1059                        "loop.0.0.ph:\n"
   1060                        "  br label %loop.0.0\n"
   1061                        "loop.0.0:\n"
   1062                        "  %cond.0.0 = load volatile i1, i1* %ptr\n"
   1063                        "  br i1 %cond.0.0, label %loop.0.0, label %loop.0.2.ph\n"
   1064                        "loop.0.2.ph:\n"
   1065                        "  br label %loop.0.2\n"
   1066                        "loop.0.2:\n"
   1067                        "  %cond.0.2 = load volatile i1, i1* %ptr\n"
   1068                        "  br i1 %cond.0.2, label %loop.0.2, label %loop.0.latch\n"
   1069                        "loop.0.latch:\n"
   1070                        "  br label %loop.0\n"
   1071                        "loop.2.ph:\n"
   1072                        "  br label %loop.2\n"
   1073                        "loop.2:\n"
   1074                        "  %cond.2 = load volatile i1, i1* %ptr\n"
   1075                        "  br i1 %cond.2, label %loop.2, label %end\n"
   1076                        "end:\n"
   1077                        "  ret void\n"
   1078                        "}\n");
   1079 
   1080   // Build up variables referring into the IR so we can rewrite it below
   1081   // easily.
   1082   Function &F = *M->begin();
   1083   ASSERT_THAT(F, HasName("f"));
   1084   Argument &Ptr = *F.arg_begin();
   1085   auto BBI = F.begin();
   1086   BasicBlock &EntryBB = *BBI++;
   1087   ASSERT_THAT(EntryBB, HasName("entry"));
   1088   BasicBlock &Loop0BB = *BBI++;
   1089   ASSERT_THAT(Loop0BB, HasName("loop.0"));
   1090   BasicBlock &Loop00PHBB = *BBI++;
   1091   ASSERT_THAT(Loop00PHBB, HasName("loop.0.0.ph"));
   1092   BasicBlock &Loop00BB = *BBI++;
   1093   ASSERT_THAT(Loop00BB, HasName("loop.0.0"));
   1094   BasicBlock &Loop02PHBB = *BBI++;
   1095   ASSERT_THAT(Loop02PHBB, HasName("loop.0.2.ph"));
   1096   BasicBlock &Loop02BB = *BBI++;
   1097   ASSERT_THAT(Loop02BB, HasName("loop.0.2"));
   1098   BasicBlock &Loop0LatchBB = *BBI++;
   1099   ASSERT_THAT(Loop0LatchBB, HasName("loop.0.latch"));
   1100   BasicBlock &Loop2PHBB = *BBI++;
   1101   ASSERT_THAT(Loop2PHBB, HasName("loop.2.ph"));
   1102   BasicBlock &Loop2BB = *BBI++;
   1103   ASSERT_THAT(Loop2BB, HasName("loop.2"));
   1104   BasicBlock &EndBB = *BBI++;
   1105   ASSERT_THAT(EndBB, HasName("end"));
   1106   ASSERT_THAT(BBI, F.end());
   1107   auto CreateCondBr = [&](BasicBlock *TrueBB, BasicBlock *FalseBB,
   1108                           const char *Name, BasicBlock *BB) {
   1109     auto *Cond = new LoadInst(&Ptr, Name, /*isVolatile*/ true, BB);
   1110     BranchInst::Create(TrueBB, FalseBB, Cond, BB);
   1111   };
   1112 
   1113   // Build the pass managers and register our pipeline. We build a single loop
   1114   // pass pipeline consisting of three mock pass runs over each loop. After
   1115   // this we run both domtree and loop verification passes to make sure that
   1116   // the IR remained valid during our mutations.
   1117   ModulePassManager MPM(true);
   1118   FunctionPassManager FPM(true);
   1119   LoopPassManager LPM(true);
   1120   LPM.addPass(MLPHandle.getPass());
   1121   LPM.addPass(MLPHandle.getPass());
   1122   LPM.addPass(MLPHandle.getPass());
   1123   FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM)));
   1124   FPM.addPass(DominatorTreeVerifierPass());
   1125   FPM.addPass(LoopVerifierPass());
   1126   MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
   1127 
   1128   // All the visit orders are deterministic, so we use simple fully order
   1129   // expectations.
   1130   ::testing::InSequence MakeExpectationsSequenced;
   1131 
   1132   // We run loop passes three times over each of the loops.
   1133   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
   1134       .WillOnce(Invoke(getLoopAnalysisResult));
   1135   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
   1136 
   1137   // On the second run, we insert a sibling loop.
   1138   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
   1139       .WillOnce(Invoke([&](Loop &L, LoopAnalysisManager &AM,
   1140                            LoopStandardAnalysisResults &AR,
   1141                            LPMUpdater &Updater) {
   1142         auto *NewLoop = AR.LI.AllocateLoop();
   1143         L.getParentLoop()->addChildLoop(NewLoop);
   1144         auto *NewLoop01PHBB = BasicBlock::Create(Context, "loop.0.1.ph", &F, &Loop02PHBB);
   1145         auto *NewLoop01BB = BasicBlock::Create(Context, "loop.0.1", &F, &Loop02PHBB);
   1146         BranchInst::Create(NewLoop01BB, NewLoop01PHBB);
   1147         CreateCondBr(&Loop02PHBB, NewLoop01BB, "cond.0.1", NewLoop01BB);
   1148         Loop00BB.getTerminator()->replaceUsesOfWith(&Loop02PHBB, NewLoop01PHBB);
   1149         AR.DT.addNewBlock(NewLoop01PHBB, &Loop00BB);
   1150         auto *NewDTNode = AR.DT.addNewBlock(NewLoop01BB, NewLoop01PHBB);
   1151         AR.DT.changeImmediateDominator(AR.DT[&Loop02PHBB], NewDTNode);
   1152         EXPECT_TRUE(AR.DT.verify());
   1153         L.getParentLoop()->addBasicBlockToLoop(NewLoop01PHBB, AR.LI);
   1154         NewLoop->addBasicBlockToLoop(NewLoop01BB, AR.LI);
   1155         L.getParentLoop()->verifyLoop();
   1156         Updater.addSiblingLoops({NewLoop});
   1157         return PreservedAnalyses::all();
   1158       }));
   1159   // We finish processing this loop as sibling loops don't perturb the
   1160   // postorder walk.
   1161   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
   1162       .WillOnce(Invoke(getLoopAnalysisResult));
   1163 
   1164   // We visit the inserted sibling next.
   1165   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1"), _, _, _))
   1166       .WillOnce(Invoke(getLoopAnalysisResult));
   1167   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
   1168   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1"), _, _, _))
   1169       .Times(2)
   1170       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1171 
   1172   EXPECT_CALL(MLPHandle, run(HasName("loop.0.2"), _, _, _))
   1173       .WillOnce(Invoke(getLoopAnalysisResult));
   1174   EXPECT_CALL(MLAHandle, run(HasName("loop.0.2"), _, _));
   1175   EXPECT_CALL(MLPHandle, run(HasName("loop.0.2"), _, _, _))
   1176       .WillOnce(Invoke(getLoopAnalysisResult));
   1177   // Next, on the third pass run on the last inner loop we add more new
   1178   // siblings, more than one, and one with nested child loops. By doing this at
   1179   // the end we make sure that edge case works well.
   1180   EXPECT_CALL(MLPHandle, run(HasName("loop.0.2"), _, _, _))
   1181       .WillOnce(Invoke([&](Loop &L, LoopAnalysisManager &AM,
   1182                            LoopStandardAnalysisResults &AR,
   1183                            LPMUpdater &Updater) {
   1184         Loop *NewLoops[] = {AR.LI.AllocateLoop(), AR.LI.AllocateLoop(),
   1185                             AR.LI.AllocateLoop()};
   1186         L.getParentLoop()->addChildLoop(NewLoops[0]);
   1187         L.getParentLoop()->addChildLoop(NewLoops[1]);
   1188         NewLoops[1]->addChildLoop(NewLoops[2]);
   1189         auto *NewLoop03PHBB =
   1190             BasicBlock::Create(Context, "loop.0.3.ph", &F, &Loop0LatchBB);
   1191         auto *NewLoop03BB =
   1192             BasicBlock::Create(Context, "loop.0.3", &F, &Loop0LatchBB);
   1193         auto *NewLoop04PHBB =
   1194             BasicBlock::Create(Context, "loop.0.4.ph", &F, &Loop0LatchBB);
   1195         auto *NewLoop04BB =
   1196             BasicBlock::Create(Context, "loop.0.4", &F, &Loop0LatchBB);
   1197         auto *NewLoop040PHBB =
   1198             BasicBlock::Create(Context, "loop.0.4.0.ph", &F, &Loop0LatchBB);
   1199         auto *NewLoop040BB =
   1200             BasicBlock::Create(Context, "loop.0.4.0", &F, &Loop0LatchBB);
   1201         auto *NewLoop04LatchBB =
   1202             BasicBlock::Create(Context, "loop.0.4.latch", &F, &Loop0LatchBB);
   1203         Loop02BB.getTerminator()->replaceUsesOfWith(&Loop0LatchBB, NewLoop03PHBB);
   1204         BranchInst::Create(NewLoop03BB, NewLoop03PHBB);
   1205         CreateCondBr(NewLoop04PHBB, NewLoop03BB, "cond.0.3", NewLoop03BB);
   1206         BranchInst::Create(NewLoop04BB, NewLoop04PHBB);
   1207         CreateCondBr(&Loop0LatchBB, NewLoop040PHBB, "cond.0.4", NewLoop04BB);
   1208         BranchInst::Create(NewLoop040BB, NewLoop040PHBB);
   1209         CreateCondBr(NewLoop04LatchBB, NewLoop040BB, "cond.0.4.0", NewLoop040BB);
   1210         BranchInst::Create(NewLoop04BB, NewLoop04LatchBB);
   1211         AR.DT.addNewBlock(NewLoop03PHBB, &Loop02BB);
   1212         AR.DT.addNewBlock(NewLoop03BB, NewLoop03PHBB);
   1213         AR.DT.addNewBlock(NewLoop04PHBB, NewLoop03BB);
   1214         auto *NewDTNode = AR.DT.addNewBlock(NewLoop04BB, NewLoop04PHBB);
   1215         AR.DT.changeImmediateDominator(AR.DT[&Loop0LatchBB], NewDTNode);
   1216         AR.DT.addNewBlock(NewLoop040PHBB, NewLoop04BB);
   1217         AR.DT.addNewBlock(NewLoop040BB, NewLoop040PHBB);
   1218         AR.DT.addNewBlock(NewLoop04LatchBB, NewLoop040BB);
   1219         EXPECT_TRUE(AR.DT.verify());
   1220         L.getParentLoop()->addBasicBlockToLoop(NewLoop03PHBB, AR.LI);
   1221         NewLoops[0]->addBasicBlockToLoop(NewLoop03BB, AR.LI);
   1222         L.getParentLoop()->addBasicBlockToLoop(NewLoop04PHBB, AR.LI);
   1223         NewLoops[1]->addBasicBlockToLoop(NewLoop04BB, AR.LI);
   1224         NewLoops[1]->addBasicBlockToLoop(NewLoop040PHBB, AR.LI);
   1225         NewLoops[2]->addBasicBlockToLoop(NewLoop040BB, AR.LI);
   1226         NewLoops[1]->addBasicBlockToLoop(NewLoop04LatchBB, AR.LI);
   1227         L.getParentLoop()->verifyLoop();
   1228         Updater.addSiblingLoops({NewLoops[0], NewLoops[1]});
   1229         return PreservedAnalyses::all();
   1230       }));
   1231 
   1232   EXPECT_CALL(MLPHandle, run(HasName("loop.0.3"), _, _, _))
   1233       .WillOnce(Invoke(getLoopAnalysisResult));
   1234   EXPECT_CALL(MLAHandle, run(HasName("loop.0.3"), _, _));
   1235   EXPECT_CALL(MLPHandle, run(HasName("loop.0.3"), _, _, _))
   1236       .Times(2)
   1237       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1238 
   1239   // Note that we need to visit the inner loop of this added sibling before the
   1240   // sibling itself!
   1241   EXPECT_CALL(MLPHandle, run(HasName("loop.0.4.0"), _, _, _))
   1242       .WillOnce(Invoke(getLoopAnalysisResult));
   1243   EXPECT_CALL(MLAHandle, run(HasName("loop.0.4.0"), _, _));
   1244   EXPECT_CALL(MLPHandle, run(HasName("loop.0.4.0"), _, _, _))
   1245       .Times(2)
   1246       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1247 
   1248   EXPECT_CALL(MLPHandle, run(HasName("loop.0.4"), _, _, _))
   1249       .WillOnce(Invoke(getLoopAnalysisResult));
   1250   EXPECT_CALL(MLAHandle, run(HasName("loop.0.4"), _, _));
   1251   EXPECT_CALL(MLPHandle, run(HasName("loop.0.4"), _, _, _))
   1252       .Times(2)
   1253       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1254 
   1255   // And only now do we visit the outermost loop of the nest.
   1256   EXPECT_CALL(MLPHandle, run(HasName("loop.0"), _, _, _))
   1257       .WillOnce(Invoke(getLoopAnalysisResult));
   1258   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
   1259   // On the second pass, we add sibling loops which become new top-level loops.
   1260   EXPECT_CALL(MLPHandle, run(HasName("loop.0"), _, _, _))
   1261       .WillOnce(Invoke([&](Loop &L, LoopAnalysisManager &AM,
   1262                            LoopStandardAnalysisResults &AR,
   1263                            LPMUpdater &Updater) {
   1264         auto *NewLoop = AR.LI.AllocateLoop();
   1265         AR.LI.addTopLevelLoop(NewLoop);
   1266         auto *NewLoop1PHBB = BasicBlock::Create(Context, "loop.1.ph", &F, &Loop2BB);
   1267         auto *NewLoop1BB = BasicBlock::Create(Context, "loop.1", &F, &Loop2BB);
   1268         BranchInst::Create(NewLoop1BB, NewLoop1PHBB);
   1269         CreateCondBr(&Loop2PHBB, NewLoop1BB, "cond.1", NewLoop1BB);
   1270         Loop0BB.getTerminator()->replaceUsesOfWith(&Loop2PHBB, NewLoop1PHBB);
   1271         AR.DT.addNewBlock(NewLoop1PHBB, &Loop0BB);
   1272         auto *NewDTNode = AR.DT.addNewBlock(NewLoop1BB, NewLoop1PHBB);
   1273         AR.DT.changeImmediateDominator(AR.DT[&Loop2PHBB], NewDTNode);
   1274         EXPECT_TRUE(AR.DT.verify());
   1275         NewLoop->addBasicBlockToLoop(NewLoop1BB, AR.LI);
   1276         NewLoop->verifyLoop();
   1277         Updater.addSiblingLoops({NewLoop});
   1278         return PreservedAnalyses::all();
   1279       }));
   1280   EXPECT_CALL(MLPHandle, run(HasName("loop.0"), _, _, _))
   1281       .WillOnce(Invoke(getLoopAnalysisResult));
   1282 
   1283   EXPECT_CALL(MLPHandle, run(HasName("loop.1"), _, _, _))
   1284       .WillOnce(Invoke(getLoopAnalysisResult));
   1285   EXPECT_CALL(MLAHandle, run(HasName("loop.1"), _, _));
   1286   EXPECT_CALL(MLPHandle, run(HasName("loop.1"), _, _, _))
   1287       .Times(2)
   1288       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1289 
   1290   EXPECT_CALL(MLPHandle, run(HasName("loop.2"), _, _, _))
   1291       .WillOnce(Invoke(getLoopAnalysisResult));
   1292   EXPECT_CALL(MLAHandle, run(HasName("loop.2"), _, _));
   1293   EXPECT_CALL(MLPHandle, run(HasName("loop.2"), _, _, _))
   1294       .Times(2)
   1295       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1296 
   1297   // Now that all the expected actions are registered, run the pipeline over
   1298   // our module. All of our expectations are verified when the test finishes.
   1299   MPM.run(*M, MAM);
   1300 }
   1301 
   1302 TEST_F(LoopPassManagerTest, LoopDeletion) {
   1303   // Build a module with a single loop nest that contains one outer loop with
   1304   // three subloops, and one of those with its own subloop. We will
   1305   // incrementally delete all of these to test different deletion scenarios.
   1306   M = parseIR(Context, "define void @f(i1* %ptr) {\n"
   1307                        "entry:\n"
   1308                        "  br label %loop.0\n"
   1309                        "loop.0:\n"
   1310                        "  %cond.0 = load volatile i1, i1* %ptr\n"
   1311                        "  br i1 %cond.0, label %loop.0.0.ph, label %end\n"
   1312                        "loop.0.0.ph:\n"
   1313                        "  br label %loop.0.0\n"
   1314                        "loop.0.0:\n"
   1315                        "  %cond.0.0 = load volatile i1, i1* %ptr\n"
   1316                        "  br i1 %cond.0.0, label %loop.0.0, label %loop.0.1.ph\n"
   1317                        "loop.0.1.ph:\n"
   1318                        "  br label %loop.0.1\n"
   1319                        "loop.0.1:\n"
   1320                        "  %cond.0.1 = load volatile i1, i1* %ptr\n"
   1321                        "  br i1 %cond.0.1, label %loop.0.1, label %loop.0.2.ph\n"
   1322                        "loop.0.2.ph:\n"
   1323                        "  br label %loop.0.2\n"
   1324                        "loop.0.2:\n"
   1325                        "  %cond.0.2 = load volatile i1, i1* %ptr\n"
   1326                        "  br i1 %cond.0.2, label %loop.0.2.0.ph, label %loop.0.latch\n"
   1327                        "loop.0.2.0.ph:\n"
   1328                        "  br label %loop.0.2.0\n"
   1329                        "loop.0.2.0:\n"
   1330                        "  %cond.0.2.0 = load volatile i1, i1* %ptr\n"
   1331                        "  br i1 %cond.0.2.0, label %loop.0.2.0, label %loop.0.2.latch\n"
   1332                        "loop.0.2.latch:\n"
   1333                        "  br label %loop.0.2\n"
   1334                        "loop.0.latch:\n"
   1335                        "  br label %loop.0\n"
   1336                        "end:\n"
   1337                        "  ret void\n"
   1338                        "}\n");
   1339 
   1340   // Build up variables referring into the IR so we can rewrite it below
   1341   // easily.
   1342   Function &F = *M->begin();
   1343   ASSERT_THAT(F, HasName("f"));
   1344   Argument &Ptr = *F.arg_begin();
   1345   auto BBI = F.begin();
   1346   BasicBlock &EntryBB = *BBI++;
   1347   ASSERT_THAT(EntryBB, HasName("entry"));
   1348   BasicBlock &Loop0BB = *BBI++;
   1349   ASSERT_THAT(Loop0BB, HasName("loop.0"));
   1350   BasicBlock &Loop00PHBB = *BBI++;
   1351   ASSERT_THAT(Loop00PHBB, HasName("loop.0.0.ph"));
   1352   BasicBlock &Loop00BB = *BBI++;
   1353   ASSERT_THAT(Loop00BB, HasName("loop.0.0"));
   1354   BasicBlock &Loop01PHBB = *BBI++;
   1355   ASSERT_THAT(Loop01PHBB, HasName("loop.0.1.ph"));
   1356   BasicBlock &Loop01BB = *BBI++;
   1357   ASSERT_THAT(Loop01BB, HasName("loop.0.1"));
   1358   BasicBlock &Loop02PHBB = *BBI++;
   1359   ASSERT_THAT(Loop02PHBB, HasName("loop.0.2.ph"));
   1360   BasicBlock &Loop02BB = *BBI++;
   1361   ASSERT_THAT(Loop02BB, HasName("loop.0.2"));
   1362   BasicBlock &Loop020PHBB = *BBI++;
   1363   ASSERT_THAT(Loop020PHBB, HasName("loop.0.2.0.ph"));
   1364   BasicBlock &Loop020BB = *BBI++;
   1365   ASSERT_THAT(Loop020BB, HasName("loop.0.2.0"));
   1366   BasicBlock &Loop02LatchBB = *BBI++;
   1367   ASSERT_THAT(Loop02LatchBB, HasName("loop.0.2.latch"));
   1368   BasicBlock &Loop0LatchBB = *BBI++;
   1369   ASSERT_THAT(Loop0LatchBB, HasName("loop.0.latch"));
   1370   BasicBlock &EndBB = *BBI++;
   1371   ASSERT_THAT(EndBB, HasName("end"));
   1372   ASSERT_THAT(BBI, F.end());
   1373 
   1374   // Helper to do the actual deletion of a loop. We directly encode this here
   1375   // to isolate ourselves from the rest of LLVM and for simplicity. Here we can
   1376   // egregiously cheat based on knowledge of the test case. For example, we
   1377   // have no PHI nodes and there is always a single i-dom.
   1378   auto EraseLoop = [](Loop &L, BasicBlock &IDomBB,
   1379                       LoopStandardAnalysisResults &AR, LPMUpdater &Updater) {
   1380     assert(L.empty() && "Can only delete leaf loops with this routine!");
   1381     SmallVector<BasicBlock *, 4> LoopBBs(L.block_begin(), L.block_end());
   1382     Updater.markLoopAsDeleted(L, L.getName());
   1383     IDomBB.getTerminator()->replaceUsesOfWith(L.getHeader(),
   1384                                               L.getUniqueExitBlock());
   1385     for (BasicBlock *LoopBB : LoopBBs) {
   1386       SmallVector<DomTreeNode *, 4> ChildNodes(AR.DT[LoopBB]->begin(),
   1387                                                AR.DT[LoopBB]->end());
   1388       for (DomTreeNode *ChildNode : ChildNodes)
   1389         AR.DT.changeImmediateDominator(ChildNode, AR.DT[&IDomBB]);
   1390       AR.DT.eraseNode(LoopBB);
   1391       AR.LI.removeBlock(LoopBB);
   1392       LoopBB->dropAllReferences();
   1393     }
   1394     for (BasicBlock *LoopBB : LoopBBs)
   1395       LoopBB->eraseFromParent();
   1396 
   1397     AR.LI.erase(&L);
   1398   };
   1399 
   1400   // Build up the pass managers.
   1401   ModulePassManager MPM(true);
   1402   FunctionPassManager FPM(true);
   1403   // We run several loop pass pipelines across the loop nest, but they all take
   1404   // the same form of three mock pass runs in a loop pipeline followed by
   1405   // domtree and loop verification. We use a lambda to stamp this out each
   1406   // time.
   1407   auto AddLoopPipelineAndVerificationPasses = [&] {
   1408     LoopPassManager LPM(true);
   1409     LPM.addPass(MLPHandle.getPass());
   1410     LPM.addPass(MLPHandle.getPass());
   1411     LPM.addPass(MLPHandle.getPass());
   1412     FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM)));
   1413     FPM.addPass(DominatorTreeVerifierPass());
   1414     FPM.addPass(LoopVerifierPass());
   1415   };
   1416 
   1417   // All the visit orders are deterministic so we use simple fully order
   1418   // expectations.
   1419   ::testing::InSequence MakeExpectationsSequenced;
   1420 
   1421   // We run the loop pipeline with three passes over each of the loops. When
   1422   // running over the middle loop, the second pass in the pipeline deletes it.
   1423   // This should prevent the third pass from visiting it but otherwise leave
   1424   // the process unimpacted.
   1425   AddLoopPipelineAndVerificationPasses();
   1426   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
   1427       .WillOnce(Invoke(getLoopAnalysisResult));
   1428   EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
   1429   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
   1430       .Times(2)
   1431       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1432 
   1433   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1"), _, _, _))
   1434       .WillOnce(Invoke(getLoopAnalysisResult));
   1435   EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
   1436   EXPECT_CALL(MLPHandle, run(HasName("loop.0.1"), _, _, _))
   1437       .WillOnce(
   1438           Invoke([&](Loop &L, LoopAnalysisManager &AM,
   1439                      LoopStandardAnalysisResults &AR, LPMUpdater &Updater) {
   1440             Loop *ParentL = L.getParentLoop();
   1441             AR.SE.forgetLoop(&L);
   1442             EraseLoop(L, Loop01PHBB, AR, Updater);
   1443             ParentL->verifyLoop();
   1444             return PreservedAnalyses::all();
   1445           }));
   1446 
   1447   EXPECT_CALL(MLPHandle, run(HasName("loop.0.2.0"), _, _, _))
   1448       .WillOnce(Invoke(getLoopAnalysisResult));
   1449   EXPECT_CALL(MLAHandle, run(HasName("loop.0.2.0"), _, _));
   1450   EXPECT_CALL(MLPHandle, run(HasName("loop.0.2.0"), _, _, _))
   1451       .Times(2)
   1452       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1453 
   1454   EXPECT_CALL(MLPHandle, run(HasName("loop.0.2"), _, _, _))
   1455       .WillOnce(Invoke(getLoopAnalysisResult));
   1456   EXPECT_CALL(MLAHandle, run(HasName("loop.0.2"), _, _));
   1457   EXPECT_CALL(MLPHandle, run(HasName("loop.0.2"), _, _, _))
   1458       .Times(2)
   1459       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1460 
   1461   EXPECT_CALL(MLPHandle, run(HasName("loop.0"), _, _, _))
   1462       .WillOnce(Invoke(getLoopAnalysisResult));
   1463   EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
   1464   EXPECT_CALL(MLPHandle, run(HasName("loop.0"), _, _, _))
   1465       .Times(2)
   1466       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1467 
   1468   // Run the loop pipeline again. This time we delete the last loop, which
   1469   // contains a nested loop within it and insert a new loop into the nest. This
   1470   // makes sure we can handle nested loop deletion.
   1471   AddLoopPipelineAndVerificationPasses();
   1472   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
   1473       .Times(3)
   1474       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1475 
   1476   EXPECT_CALL(MLPHandle, run(HasName("loop.0.2.0"), _, _, _))
   1477       .Times(3)
   1478       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1479 
   1480   EXPECT_CALL(MLPHandle, run(HasName("loop.0.2"), _, _, _))
   1481       .WillOnce(Invoke(getLoopAnalysisResult));
   1482   BasicBlock *NewLoop03PHBB;
   1483   EXPECT_CALL(MLPHandle, run(HasName("loop.0.2"), _, _, _))
   1484       .WillOnce(
   1485           Invoke([&](Loop &L, LoopAnalysisManager &AM,
   1486                      LoopStandardAnalysisResults &AR, LPMUpdater &Updater) {
   1487             AR.SE.forgetLoop(*L.begin());
   1488             EraseLoop(**L.begin(), Loop020PHBB, AR, Updater);
   1489 
   1490             auto *ParentL = L.getParentLoop();
   1491             AR.SE.forgetLoop(&L);
   1492             EraseLoop(L, Loop02PHBB, AR, Updater);
   1493 
   1494             // Now insert a new sibling loop.
   1495             auto *NewSibling = AR.LI.AllocateLoop();
   1496             ParentL->addChildLoop(NewSibling);
   1497             NewLoop03PHBB =
   1498                 BasicBlock::Create(Context, "loop.0.3.ph", &F, &Loop0LatchBB);
   1499             auto *NewLoop03BB =
   1500                 BasicBlock::Create(Context, "loop.0.3", &F, &Loop0LatchBB);
   1501             BranchInst::Create(NewLoop03BB, NewLoop03PHBB);
   1502             auto *Cond = new LoadInst(&Ptr, "cond.0.3", /*isVolatile*/ true,
   1503                                       NewLoop03BB);
   1504             BranchInst::Create(&Loop0LatchBB, NewLoop03BB, Cond, NewLoop03BB);
   1505             Loop02PHBB.getTerminator()->replaceUsesOfWith(&Loop0LatchBB,
   1506                                                           NewLoop03PHBB);
   1507             AR.DT.addNewBlock(NewLoop03PHBB, &Loop02PHBB);
   1508             AR.DT.addNewBlock(NewLoop03BB, NewLoop03PHBB);
   1509             AR.DT.changeImmediateDominator(AR.DT[&Loop0LatchBB],
   1510                                            AR.DT[NewLoop03BB]);
   1511             EXPECT_TRUE(AR.DT.verify());
   1512             ParentL->addBasicBlockToLoop(NewLoop03PHBB, AR.LI);
   1513             NewSibling->addBasicBlockToLoop(NewLoop03BB, AR.LI);
   1514             NewSibling->verifyLoop();
   1515             ParentL->verifyLoop();
   1516             Updater.addSiblingLoops({NewSibling});
   1517             return PreservedAnalyses::all();
   1518           }));
   1519 
   1520   // To respect our inner-to-outer traversal order, we must visit the
   1521   // newly-inserted sibling of the loop we just deleted before we visit the
   1522   // outer loop. When we do so, this must compute a fresh analysis result, even
   1523   // though our new loop has the same pointer value as the loop we deleted.
   1524   EXPECT_CALL(MLPHandle, run(HasName("loop.0.3"), _, _, _))
   1525       .WillOnce(Invoke(getLoopAnalysisResult));
   1526   EXPECT_CALL(MLAHandle, run(HasName("loop.0.3"), _, _));
   1527   EXPECT_CALL(MLPHandle, run(HasName("loop.0.3"), _, _, _))
   1528       .Times(2)
   1529       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1530 
   1531   EXPECT_CALL(MLPHandle, run(HasName("loop.0"), _, _, _))
   1532       .Times(3)
   1533       .WillRepeatedly(Invoke(getLoopAnalysisResult));
   1534 
   1535   // In the final loop pipeline run we delete every loop, including the last
   1536   // loop of the nest. We do this again in the second pass in the pipeline, and
   1537   // as a consequence we never make it to three runs on any loop. We also cover
   1538   // deleting multiple loops in a single pipeline, deleting the first loop and
   1539   // deleting the (last) top level loop.
   1540   AddLoopPipelineAndVerificationPasses();
   1541   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
   1542       .WillOnce(Invoke(getLoopAnalysisResult));
   1543   EXPECT_CALL(MLPHandle, run(HasName("loop.0.0"), _, _, _))
   1544       .WillOnce(
   1545           Invoke([&](Loop &L, LoopAnalysisManager &AM,
   1546                      LoopStandardAnalysisResults &AR, LPMUpdater &Updater) {
   1547             AR.SE.forgetLoop(&L);
   1548             EraseLoop(L, Loop00PHBB, AR, Updater);
   1549             return PreservedAnalyses::all();
   1550           }));
   1551 
   1552   EXPECT_CALL(MLPHandle, run(HasName("loop.0.3"), _, _, _))
   1553       .WillOnce(Invoke(getLoopAnalysisResult));
   1554   EXPECT_CALL(MLPHandle, run(HasName("loop.0.3"), _, _, _))
   1555       .WillOnce(
   1556           Invoke([&](Loop &L, LoopAnalysisManager &AM,
   1557                      LoopStandardAnalysisResults &AR, LPMUpdater &Updater) {
   1558             AR.SE.forgetLoop(&L);
   1559             EraseLoop(L, *NewLoop03PHBB, AR, Updater);
   1560             return PreservedAnalyses::all();
   1561           }));
   1562 
   1563   EXPECT_CALL(MLPHandle, run(HasName("loop.0"), _, _, _))
   1564       .WillOnce(Invoke(getLoopAnalysisResult));
   1565   EXPECT_CALL(MLPHandle, run(HasName("loop.0"), _, _, _))
   1566       .WillOnce(
   1567           Invoke([&](Loop &L, LoopAnalysisManager &AM,
   1568                      LoopStandardAnalysisResults &AR, LPMUpdater &Updater) {
   1569             AR.SE.forgetLoop(&L);
   1570             EraseLoop(L, EntryBB, AR, Updater);
   1571             return PreservedAnalyses::all();
   1572           }));
   1573 
   1574   // Add the function pass pipeline now that it is fully built up and run it
   1575   // over the module's one function.
   1576   MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
   1577   MPM.run(*M, MAM);
   1578 }
   1579 }
   1580