diff --git a/llvm/include/llvm/Analysis/LoopAccessAnalysis.h b/llvm/include/llvm/Analysis/LoopAccessAnalysis.h --- a/llvm/include/llvm/Analysis/LoopAccessAnalysis.h +++ b/llvm/include/llvm/Analysis/LoopAccessAnalysis.h @@ -764,6 +764,25 @@ bool isConsecutiveAccess(Value *A, Value *B, const DataLayout &DL, ScalarEvolution &SE, bool CheckType = true); +class LoopAccessInfoManager { + /// The cache. + DenseMap> LoopAccessInfoMap; + + // The used analysis passes. + ScalarEvolution &SE; + AAResults &AA; + DominatorTree &DT; + LoopInfo &LI; + const TargetLibraryInfo *TLI = nullptr; + +public: + LoopAccessInfoManager(ScalarEvolution &SE, AAResults &AA, DominatorTree &DT, + LoopInfo &LI, const TargetLibraryInfo *TLI) + : SE(SE), AA(AA), DT(DT), LI(LI), TLI(TLI) {} + + const LoopAccessInfo &getInfo(Loop &L); +}; + /// This analysis provides dependence information for the memory accesses /// of a loop. /// @@ -819,9 +838,9 @@ static AnalysisKey Key; public: - typedef LoopAccessInfo Result; + typedef LoopAccessInfoManager Result; - Result run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR); + Result run(Function &F, FunctionAnalysisManager &AM); }; inline Instruction *MemoryDepChecker::Dependence::getSource( diff --git a/llvm/include/llvm/Transforms/Scalar/LoopAccessAnalysisPrinter.h b/llvm/include/llvm/Transforms/Scalar/LoopAccessAnalysisPrinter.h --- a/llvm/include/llvm/Transforms/Scalar/LoopAccessAnalysisPrinter.h +++ b/llvm/include/llvm/Transforms/Scalar/LoopAccessAnalysisPrinter.h @@ -15,7 +15,9 @@ class LPMUpdater; class Loop; +class Function; class raw_ostream; + /// Printer pass for the \c LoopAccessInfo results. class LoopAccessInfoPrinterPass : public PassInfoMixin { @@ -23,8 +25,7 @@ public: explicit LoopAccessInfoPrinterPass(raw_ostream &OS) : OS(OS) {} - PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, - LoopStandardAnalysisResults &AR, LPMUpdater &U); + PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); }; } // End llvm namespace diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp --- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp +++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp @@ -2669,6 +2669,16 @@ PSE->print(OS, Depth); } +const LoopAccessInfo &LoopAccessInfoManager::getInfo(Loop &L) { + auto I = LoopAccessInfoMap.insert({&L, nullptr}); + + if (I.second) + I.first->second = + std::make_unique(&L, &SE, TLI, &AA, &DT, &LI); + + return *I.first->second; +} + LoopAccessLegacyAnalysis::LoopAccessLegacyAnalysis() : FunctionPass(ID) { initializeLoopAccessLegacyAnalysisPass(*PassRegistry::getPassRegistry()); } @@ -2713,6 +2723,14 @@ AU.setPreservesAll(); } +LoopAccessInfoManager LoopAccessAnalysis::run(Function &F, + FunctionAnalysisManager &AM) { + return LoopAccessInfoManager( + AM.getResult(F), AM.getResult(F), + AM.getResult(F), AM.getResult(F), + &AM.getResult(F)); +} + char LoopAccessLegacyAnalysis::ID = 0; static const char laa_name[] = "Loop Access Analysis"; #define LAA_NAME "loop-accesses" @@ -2726,11 +2744,6 @@ AnalysisKey LoopAccessAnalysis::Key; -LoopAccessInfo LoopAccessAnalysis::run(Loop &L, LoopAnalysisManager &AM, - LoopStandardAnalysisResults &AR) { - return LoopAccessInfo(&L, &AR.SE, &AR.TLI, &AR.AA, &AR.DT, &AR.LI); -} - namespace llvm { Pass *createLAAPass() { diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -215,6 +215,7 @@ FUNCTION_ANALYSIS("domfrontier", DominanceFrontierAnalysis()) FUNCTION_ANALYSIS("func-properties", FunctionPropertiesAnalysis()) FUNCTION_ANALYSIS("loops", LoopAnalysis()) +FUNCTION_ANALYSIS("access-info", LoopAccessAnalysis()) FUNCTION_ANALYSIS("lazy-value-info", LazyValueAnalysis()) FUNCTION_ANALYSIS("da", DependenceAnalysis()) FUNCTION_ANALYSIS("inliner-size-estimator", InlineSizeEstimatorAnalysis()) @@ -354,6 +355,7 @@ FUNCTION_PASS("print", RegionInfoPrinterPass(dbgs())) FUNCTION_PASS("print", ScalarEvolutionPrinterPass(dbgs())) FUNCTION_PASS("print", StackSafetyPrinterPass(dbgs())) +FUNCTION_PASS("print", LoopAccessInfoPrinterPass(dbgs())) // TODO: rename to print after NPM switch FUNCTION_PASS("print-alias-sets", AliasSetsPrinterPass(dbgs())) FUNCTION_PASS("print-predicateinfo", PredicateInfoPrinterPass(dbgs())) @@ -495,7 +497,6 @@ #define LOOP_ANALYSIS(NAME, CREATE_PASS) #endif LOOP_ANALYSIS("no-op-loop", NoOpLoopAnalysis()) -LOOP_ANALYSIS("access-info", LoopAccessAnalysis()) LOOP_ANALYSIS("ddg", DDGAnalysis()) LOOP_ANALYSIS("iv-users", IVUsersAnalysis()) LOOP_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC)) @@ -517,7 +518,6 @@ LOOP_PASS("loop-reduce", LoopStrengthReducePass()) LOOP_PASS("indvars", IndVarSimplifyPass()) LOOP_PASS("loop-unroll-full", LoopFullUnrollPass()) -LOOP_PASS("print", LoopAccessInfoPrinterPass(dbgs())) LOOP_PASS("print", DDGAnalysisPrinterPass(dbgs())) LOOP_PASS("print", IVUsersPrinterPass(dbgs())) LOOP_PASS("print", LoopNestPrinterPass(dbgs())) diff --git a/llvm/lib/Transforms/Scalar/LoopAccessAnalysisPrinter.cpp b/llvm/lib/Transforms/Scalar/LoopAccessAnalysisPrinter.cpp --- a/llvm/lib/Transforms/Scalar/LoopAccessAnalysisPrinter.cpp +++ b/llvm/lib/Transforms/Scalar/LoopAccessAnalysisPrinter.cpp @@ -7,19 +7,27 @@ //===----------------------------------------------------------------------===// #include "llvm/Transforms/Scalar/LoopAccessAnalysisPrinter.h" +#include "llvm/ADT/PriorityWorklist.h" #include "llvm/Analysis/LoopAccessAnalysis.h" #include "llvm/Analysis/LoopInfo.h" +#include "llvm/Transforms/Utils/LoopUtils.h" + using namespace llvm; #define DEBUG_TYPE "loop-accesses" -PreservedAnalyses -LoopAccessInfoPrinterPass::run(Loop &L, LoopAnalysisManager &AM, - LoopStandardAnalysisResults &AR, LPMUpdater &) { - Function &F = *L.getHeader()->getParent(); - auto &LAI = AM.getResult(L, AR); +PreservedAnalyses LoopAccessInfoPrinterPass::run(Function &F, + FunctionAnalysisManager &AM) { + auto &LAIs = AM.getResult(F); + auto &LI = AM.getResult(F); OS << "Loop access info in function '" << F.getName() << "':\n"; - OS.indent(2) << L.getHeader()->getName() << ":\n"; - LAI.print(OS, 4); + + SmallPriorityWorklist Worklist; + appendLoopsToWorklist(LI, Worklist); + while (!Worklist.empty()) { + Loop *L = Worklist.pop_back_val(); + OS.indent(2) << L->getHeader()->getName() << ":\n"; + LAIs.getInfo(*L).print(OS, 4); + } return PreservedAnalyses::all(); } diff --git a/llvm/lib/Transforms/Scalar/LoopDistribute.cpp b/llvm/lib/Transforms/Scalar/LoopDistribute.cpp --- a/llvm/lib/Transforms/Scalar/LoopDistribute.cpp +++ b/llvm/lib/Transforms/Scalar/LoopDistribute.cpp @@ -1044,20 +1044,9 @@ auto &SE = AM.getResult(F); auto &ORE = AM.getResult(F); - // We don't directly need these analyses but they're required for loop - // analyses so provide them below. - auto &AA = AM.getResult(F); - auto &AC = AM.getResult(F); - auto &TTI = AM.getResult(F); - auto &TLI = AM.getResult(F); - - auto &LAM = AM.getResult(F).getManager(); + LoopAccessInfoManager &LAIs = AM.getResult(F); std::function GetLAA = - [&](Loop &L) -> const LoopAccessInfo & { - LoopStandardAnalysisResults AR = {AA, AC, DT, LI, SE, - TLI, TTI, nullptr, nullptr, nullptr}; - return LAM.getResult(L, AR); - }; + [&](Loop &L) -> const LoopAccessInfo & { return LAIs.getInfo(L); }; bool Changed = runImpl(F, &LI, &DT, &SE, &ORE, GetLAA); if (!Changed) diff --git a/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp b/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp --- a/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp +++ b/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp @@ -728,23 +728,17 @@ if (LI.empty()) return PreservedAnalyses::all(); auto &SE = AM.getResult(F); - auto &TTI = AM.getResult(F); auto &DT = AM.getResult(F); - auto &TLI = AM.getResult(F); - auto &AA = AM.getResult(F); auto &AC = AM.getResult(F); auto &MAMProxy = AM.getResult(F); auto *PSI = MAMProxy.getCachedResult(*F.getParent()); auto *BFI = (PSI && PSI->hasProfileSummary()) ? &AM.getResult(F) : nullptr; + LoopAccessInfoManager &LAIs = AM.getResult(F); - auto &LAM = AM.getResult(F).getManager(); bool Changed = eliminateLoadsAcrossLoops( - F, LI, DT, BFI, PSI, &SE, &AC, [&](Loop &L) -> const LoopAccessInfo & { - LoopStandardAnalysisResults AR = {AA, AC, DT, LI, SE, - TLI, TTI, nullptr, nullptr, nullptr}; - return LAM.getResult(L, AR); - }); + F, LI, DT, BFI, PSI, &SE, &AC, + [&](Loop &L) -> const LoopAccessInfo & { return LAIs.getInfo(L); }); if (!Changed) return PreservedAnalyses::all(); diff --git a/llvm/lib/Transforms/Scalar/LoopVersioningLICM.cpp b/llvm/lib/Transforms/Scalar/LoopVersioningLICM.cpp --- a/llvm/lib/Transforms/Scalar/LoopVersioningLICM.cpp +++ b/llvm/lib/Transforms/Scalar/LoopVersioningLICM.cpp @@ -671,10 +671,9 @@ const Function *F = L.getHeader()->getParent(); OptimizationRemarkEmitter ORE(F); - auto GetLAI = [&](Loop *L) -> const LoopAccessInfo & { - return AM.getResult(*L, LAR); - }; - + LoopAccessInfoManager LAIs(*SE, *AA, *DT, *LI, nullptr); + std::function GetLAI = + [&](Loop *L) -> const LoopAccessInfo & { return LAIs.getInfo(*L); }; if (!LoopVersioningLICM(AA, SE, &ORE, GetLAI).runOnLoop(&L, LI, DT)) return PreservedAnalyses::all(); return getLoopPassPreservedAnalyses(); diff --git a/llvm/lib/Transforms/Utils/LoopVersioning.cpp b/llvm/lib/Transforms/Utils/LoopVersioning.cpp --- a/llvm/lib/Transforms/Utils/LoopVersioning.cpp +++ b/llvm/lib/Transforms/Utils/LoopVersioning.cpp @@ -348,17 +348,11 @@ FunctionAnalysisManager &AM) { auto &SE = AM.getResult(F); auto &LI = AM.getResult(F); - auto &TTI = AM.getResult(F); auto &DT = AM.getResult(F); - auto &TLI = AM.getResult(F); - auto &AA = AM.getResult(F); - auto &AC = AM.getResult(F); - auto &LAM = AM.getResult(F).getManager(); + LoopAccessInfoManager &LAIs = AM.getResult(F); auto GetLAA = [&](Loop &L) -> const LoopAccessInfo & { - LoopStandardAnalysisResults AR = {AA, AC, DT, LI, SE, - TLI, TTI, nullptr, nullptr, nullptr}; - return LAM.getResult(L, AR); + return LAIs.getInfo(L); }; if (runImpl(&LI, GetLAA, &DT, &SE)) diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -10642,13 +10642,9 @@ auto &DB = AM.getResult(F); auto &ORE = AM.getResult(F); - auto &LAM = AM.getResult(F).getManager(); + LoopAccessInfoManager &LAIs = AM.getResult(F); std::function GetLAA = - [&](Loop &L) -> const LoopAccessInfo & { - LoopStandardAnalysisResults AR = {AA, AC, DT, LI, SE, - TLI, TTI, nullptr, nullptr, nullptr}; - return LAM.getResult(L, AR); - }; + [&](Loop &L) -> const LoopAccessInfo & { return LAIs.getInfo(L); }; auto &MAMProxy = AM.getResult(F); ProfileSummaryInfo *PSI = MAMProxy.getCachedResult(*F.getParent()); diff --git a/llvm/test/Other/new-pm-defaults.ll b/llvm/test/Other/new-pm-defaults.ll --- a/llvm/test/Other/new-pm-defaults.ll +++ b/llvm/test/Other/new-pm-defaults.ll @@ -239,12 +239,12 @@ ; CHECK-O-NEXT: Running pass: LoopRotatePass ; CHECK-O-NEXT: Running pass: LoopDeletionPass ; CHECK-O-NEXT: Running pass: LoopDistributePass +; CHECK-O-NEXT: Running analysis: LoopAccessAnalysis on foo ; CHECK-O-NEXT: Running pass: InjectTLIMappings ; CHECK-O-NEXT: Running pass: LoopVectorizePass ; CHECK-O-NEXT: Running analysis: BlockFrequencyAnalysis ; CHECK-O-NEXT: Running analysis: BranchProbabilityAnalysis ; CHECK-O-NEXT: Running pass: LoopLoadEliminationPass -; CHECK-O-NEXT: Running analysis: LoopAccessAnalysis ; CHECK-O-NEXT: Running pass: InstCombinePass ; CHECK-O-NEXT: Running pass: SimplifyCFGPass ; CHECK-O2-NEXT: Running pass: SLPVectorizerPass diff --git a/llvm/test/Other/new-pm-lto-defaults.ll b/llvm/test/Other/new-pm-lto-defaults.ll --- a/llvm/test/Other/new-pm-lto-defaults.ll +++ b/llvm/test/Other/new-pm-lto-defaults.ll @@ -120,6 +120,7 @@ ; CHECK-O23SZ-NEXT: Running pass: LoopDeletionPass on loop ; CHECK-O23SZ-NEXT: Running pass: LoopFullUnrollPass on loop ; CHECK-O23SZ-NEXT: Running pass: LoopDistributePass on foo +; CHECK-O23SZ-NEXT: Running analysis: LoopAccessAnalysis on foo ; CHECK-O23SZ-NEXT: Running pass: LoopVectorizePass on foo ; CHECK-O23SZ-NEXT: Running analysis: BlockFrequencyAnalysis on foo ; CHECK-O23SZ-NEXT: Running analysis: BranchProbabilityAnalysis on foo diff --git a/llvm/test/Other/new-pm-thinlto-defaults.ll b/llvm/test/Other/new-pm-thinlto-defaults.ll --- a/llvm/test/Other/new-pm-thinlto-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-defaults.ll @@ -216,12 +216,12 @@ ; CHECK-POSTLINK-O-NEXT: Running pass: LoopRotatePass ; CHECK-POSTLINK-O-NEXT: Running pass: LoopDeletionPass ; CHECK-POSTLINK-O-NEXT: Running pass: LoopDistributePass +; CHECK-POSTLINK-O-NEXT: Running analysis: LoopAccessAnalysis on foo ; CHECK-POSTLINK-O-NEXT: Running pass: InjectTLIMappings ; CHECK-POSTLINK-O-NEXT: Running pass: LoopVectorizePass ; CHECK-POSTLINK-O-NEXT: Running analysis: BlockFrequencyAnalysis ; CHECK-POSTLINK-O-NEXT: Running analysis: BranchProbabilityAnalysis ; CHECK-POSTLINK-O-NEXT: Running pass: LoopLoadEliminationPass -; CHECK-POSTLINK-O-NEXT: Running analysis: LoopAccessAnalysis ; CHECK-POSTLINK-O-NEXT: Running pass: InstCombinePass ; CHECK-POSTLINK-O-NEXT: Running pass: SimplifyCFGPass ; CHECK-POSTLINK-O2-NEXT: Running pass: SLPVectorizerPass diff --git a/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll --- a/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll @@ -174,10 +174,10 @@ ; CHECK-O-NEXT: Running pass: LoopRotatePass ; CHECK-O-NEXT: Running pass: LoopDeletionPass ; CHECK-O-NEXT: Running pass: LoopDistributePass +; CHECK-O-NEXT: Running analysis: LoopAccessAnalysis on foo ; CHECK-O-NEXT: Running pass: InjectTLIMappings ; CHECK-O-NEXT: Running pass: LoopVectorizePass ; CHECK-O-NEXT: Running pass: LoopLoadEliminationPass -; CHECK-O-NEXT: Running analysis: LoopAccessAnalysis ; CHECK-O-NEXT: Running pass: InstCombinePass ; CHECK-O-NEXT: Running pass: SimplifyCFGPass ; CHECK-O2-NEXT: Running pass: SLPVectorizerPass diff --git a/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll --- a/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll @@ -186,10 +186,10 @@ ; CHECK-O-NEXT: Running pass: LoopRotatePass ; CHECK-O-NEXT: Running pass: LoopDeletionPass ; CHECK-O-NEXT: Running pass: LoopDistributePass +; CHECK-O-NEXT: Running analysis: LoopAccessAnalysis ; CHECK-O-NEXT: Running pass: InjectTLIMappings ; CHECK-O-NEXT: Running pass: LoopVectorizePass ; CHECK-O-NEXT: Running pass: LoopLoadEliminationPass -; CHECK-O-NEXT: Running analysis: LoopAccessAnalysis ; CHECK-O-NEXT: Running pass: InstCombinePass ; CHECK-O-NEXT: Running pass: SimplifyCFGPass ; CHECK-O2-NEXT: Running pass: SLPVectorizerPass diff --git a/llvm/test/Transforms/LoopDistribute/basic.ll b/llvm/test/Transforms/LoopDistribute/basic.ll --- a/llvm/test/Transforms/LoopDistribute/basic.ll +++ b/llvm/test/Transforms/LoopDistribute/basic.ll @@ -1,7 +1,7 @@ ; RUN: opt -aa-pipeline=basic-aa -passes=loop-distribute -enable-loop-distribute -verify-loop-info -verify-dom-info -S \ ; RUN: < %s | FileCheck %s -; RUN: opt -aa-pipeline=basic-aa -passes='loop-distribute,loop(print)' -enable-loop-distribute \ +; RUN: opt -aa-pipeline=basic-aa -passes='loop-distribute,print' -enable-loop-distribute \ ; RUN: -verify-loop-info -verify-dom-info -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ANALYSIS ; RUN: opt -aa-pipeline=basic-aa -passes=loop-distribute,loop-vectorize -enable-loop-distribute -force-vector-width=4 -S \ diff --git a/llvm/test/Transforms/LoopDistribute/laa-invalidation.ll b/llvm/test/Transforms/LoopDistribute/laa-invalidation.ll --- a/llvm/test/Transforms/LoopDistribute/laa-invalidation.ll +++ b/llvm/test/Transforms/LoopDistribute/laa-invalidation.ll @@ -1,9 +1,59 @@ -; RUN: opt -passes='loop-load-elim,indvars,loop-distribute' -enable-loop-distribute %s - -; REQUIRES: asserts -; XFAIL: * +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -passes='loop-load-elim,indvars,loop-distribute' -enable-loop-distribute -S %s | FileCheck %s define void @test_pr50940(ptr %A, ptr %B) { +; CHECK-LABEL: @test_pr50940( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[OUTER_HEADER:%.*]] +; CHECK: outer.header: +; CHECK-NEXT: br i1 false, label [[OUTER_LATCH:%.*]], label [[INNER_PH:%.*]] +; CHECK: inner.ph: +; CHECK-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 4 +; CHECK-NEXT: [[GEP_A_3:%.*]] = getelementptr inbounds i16, ptr [[A]], i64 3 +; CHECK-NEXT: br label [[INNER_LVER_CHECK:%.*]] +; CHECK: inner.lver.check: +; CHECK-NEXT: [[UGLYGEP1:%.*]] = getelementptr i8, ptr [[A]], i64 8 +; CHECK-NEXT: [[UGLYGEP2:%.*]] = getelementptr i8, ptr [[B:%.*]], i64 2 +; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[UGLYGEP]], [[UGLYGEP2]] +; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[B]], [[UGLYGEP1]] +; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]] +; CHECK-NEXT: br i1 [[FOUND_CONFLICT]], label [[INNER_PH3_LVER_ORIG:%.*]], label [[INNER_PH3_LDIST1:%.*]] +; CHECK: inner.ph3.lver.orig: +; CHECK-NEXT: br label [[INNER_LVER_ORIG:%.*]] +; CHECK: inner.lver.orig: +; CHECK-NEXT: [[IV_LVER_ORIG:%.*]] = phi i16 [ 0, [[INNER_PH3_LVER_ORIG]] ], [ [[IV_NEXT_LVER_ORIG:%.*]], [[INNER_LVER_ORIG]] ] +; CHECK-NEXT: [[L_LVER_ORIG:%.*]] = load <2 x i16>, ptr [[UGLYGEP]], align 1 +; CHECK-NEXT: store i16 0, ptr [[GEP_A_3]], align 1 +; CHECK-NEXT: store i16 1, ptr [[B]], align 1 +; CHECK-NEXT: [[IV_NEXT_LVER_ORIG]] = add nuw nsw i16 [[IV_LVER_ORIG]], 1 +; CHECK-NEXT: [[C_1_LVER_ORIG:%.*]] = icmp ult i16 [[IV_LVER_ORIG]], 38 +; CHECK-NEXT: br i1 [[C_1_LVER_ORIG]], label [[INNER_LVER_ORIG]], label [[EXIT_LOOPEXIT:%.*]] +; CHECK: inner.ph3.ldist1: +; CHECK-NEXT: br label [[INNER_LDIST1:%.*]] +; CHECK: inner.ldist1: +; CHECK-NEXT: [[IV_LDIST1:%.*]] = phi i16 [ 0, [[INNER_PH3_LDIST1]] ], [ [[IV_NEXT_LDIST1:%.*]], [[INNER_LDIST1]] ] +; CHECK-NEXT: [[L_LDIST1:%.*]] = load <2 x i16>, ptr [[UGLYGEP]], align 1, !alias.scope !0, !noalias !3 +; CHECK-NEXT: store i16 0, ptr [[GEP_A_3]], align 1, !alias.scope !0, !noalias !3 +; CHECK-NEXT: [[IV_NEXT_LDIST1]] = add nuw nsw i16 [[IV_LDIST1]], 1 +; CHECK-NEXT: [[C_1_LDIST1:%.*]] = icmp ult i16 [[IV_LDIST1]], 38 +; CHECK-NEXT: br i1 [[C_1_LDIST1]], label [[INNER_LDIST1]], label [[INNER_PH3:%.*]] +; CHECK: inner.ph3: +; CHECK-NEXT: br label [[INNER:%.*]] +; CHECK: inner: +; CHECK-NEXT: [[IV:%.*]] = phi i16 [ 0, [[INNER_PH3]] ], [ [[IV_NEXT:%.*]], [[INNER]] ] +; CHECK-NEXT: store i16 1, ptr [[B]], align 1, !alias.scope !3 +; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i16 [[IV]], 1 +; CHECK-NEXT: [[C_1:%.*]] = icmp ult i16 [[IV]], 38 +; CHECK-NEXT: br i1 [[C_1]], label [[INNER]], label [[EXIT_LOOPEXIT4:%.*]] +; CHECK: outer.latch: +; CHECK-NEXT: br label [[OUTER_HEADER]] +; CHECK: exit.loopexit: +; CHECK-NEXT: br label [[EXIT:%.*]] +; CHECK: exit.loopexit4: +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; entry: %gep.A.1 = getelementptr inbounds i16, ptr %A, i64 1 br label %outer.header diff --git a/llvm/test/Transforms/LoopUnroll/unroll-loop-invalidation.ll b/llvm/test/Transforms/LoopUnroll/unroll-loop-invalidation.ll --- a/llvm/test/Transforms/LoopUnroll/unroll-loop-invalidation.ll +++ b/llvm/test/Transforms/LoopUnroll/unroll-loop-invalidation.ll @@ -3,28 +3,17 @@ ; analysis is cached, then unroll the loop (deleting it) and make sure that the ; next function doesn't get a cache "hit" for this stale analysis result. ; -; RUN: opt -S -passes='loop(require),loop-unroll,loop(print)' -debug-pass-manager < %s 2>&1 | FileCheck %s +; RUN: opt -S -passes='require,loop-unroll,print' -debug-pass-manager < %s 2>&1 | FileCheck %s ; -; CHECK: Running analysis: LoopAnalysis -; CHECK: Running analysis: InnerAnalysisManagerProxy< -; CHECK: Running pass: RequireAnalysisPass<{{.*}}LoopAccessAnalysis -; CHECK: Running analysis: LoopAccessAnalysis on inner1.header ; CHECK: Running pass: RequireAnalysisPass<{{.*}}LoopAccessAnalysis -; CHECK: Running analysis: LoopAccessAnalysis on inner2.header -; CHECK: Running pass: RequireAnalysisPass<{{.*}}LoopAccessAnalysis -; CHECK: Running analysis: LoopAccessAnalysis on outer.header +; CHECK: Running analysis: LoopAnalysis ; CHECK: Running pass: LoopUnrollPass -; CHECK: Clearing all analysis results for: inner2.header -; CHECK: Clearing all analysis results for: outer.header -; CHECK: Invalidating analysis: LoopAccessAnalysis on {{.*}}inner1.header -; CHECK-NOT: Invalidating analysis: LoopAccessAnalysis on {{.*}}inner1.header.1 +; CHECK: Invalidating analysis: LoopAccessAnalysis on test ; CHECK: Running pass: LoopAccessInfoPrinterPass -; CHECK: Running analysis: LoopAccessAnalysis on inner1.header +; CHECK: Running analysis: LoopAccessAnalysis on test ; CHECK: Loop access info in function 'test': ; CHECK: inner1.header: -; CHECK: Running pass: LoopAccessInfoPrinterPass -; CHECK: Running analysis: LoopAccessAnalysis on inner1.header.1 -; CHECK: Loop access info in function 'test': + ; CHECK: inner1.header.1: target triple = "x86_64-unknown-linux-gnu" diff --git a/llvm/test/Transforms/LoopVectorize/memory-dep-remarks.ll b/llvm/test/Transforms/LoopVectorize/memory-dep-remarks.ll --- a/llvm/test/Transforms/LoopVectorize/memory-dep-remarks.ll +++ b/llvm/test/Transforms/LoopVectorize/memory-dep-remarks.ll @@ -1,5 +1,5 @@ -; RUN: opt -passes='loop(require),function(loop-vectorize)' -disable-output -pass-remarks-analysis=loop-vectorize < %s 2>&1 | FileCheck %s -; RUN: opt < %s -passes='loop(require),function(loop-vectorize)' -o /dev/null -pass-remarks-output=%t.yaml +; RUN: opt -passes='function(loop-vectorize,require)' -disable-output -pass-remarks-analysis=loop-vectorize < %s 2>&1 | FileCheck %s +; RUN: opt < %s -passes='function(require,loop-vectorize)' -o /dev/null -pass-remarks-output=%t.yaml ; RUN: cat %t.yaml | FileCheck -check-prefix=YAML %s target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" diff --git a/llvm/test/Transforms/LoopVectorize/novect-lcssa-cfg-invalidation.ll b/llvm/test/Transforms/LoopVectorize/novect-lcssa-cfg-invalidation.ll --- a/llvm/test/Transforms/LoopVectorize/novect-lcssa-cfg-invalidation.ll +++ b/llvm/test/Transforms/LoopVectorize/novect-lcssa-cfg-invalidation.ll @@ -8,11 +8,11 @@ define i32 @novect(i32* %p) { ; CHECK: Running pass: LoopVectorizePass on novect -; CHECK: Clearing all analysis results for: ; CHECK: Invalidating analysis: ScalarEvolutionAnalysis on novect ; CHECK-NOT: Invalidating analysis: BranchProbabilityAnalysis on novect ; CHECK-NOT: Invalidating analysis: BlockFrequencyAnalysis on novect ; CHECK: Invalidating analysis: DemandedBitsAnalysis on novect +; CHECK: Invalidating analysis: LoopAccessAnalysis on novect ; CHECK: Running pass: JumpThreadingPass on novect ; CHECK: entry: diff --git a/llvm/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch-markloopasdeleted.ll b/llvm/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch-markloopasdeleted.ll --- a/llvm/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch-markloopasdeleted.ll +++ b/llvm/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch-markloopasdeleted.ll @@ -4,7 +4,7 @@ ; Running loop-distribute will result in LoopAccessAnalysis being required and ; cached in the LoopAnalysisManagerFunctionProxy. ; -; CHECK: Running analysis: LoopAccessAnalysis on loop_a_inner +; CHECK: Running analysis: LoopAccessAnalysis on test6 ; Then simple-loop-unswitch is removing/replacing some loops (resulting in @@ -27,7 +27,10 @@ ; loop_a_inner.us). This kind of verifies that it was correct to remove the ; loop_a_inner related analysis above. ; -; CHECK: Running analysis: LoopAccessAnalysis on loop_a_inner.us +; CHECK: Invalidating analysis: LoopAccessAnalysis on test6 +; CHECK-NEXT: Running pass: LoopDistributePass on test6 +; CHECK-NEXT: Running analysis: PreservedCFGCheckerAnalysis on test6 +; CHECK-NEXT: Running analysis: LoopAccessAnalysis on test6 define i32 @test6(i1* %ptr, i1 %cond1, i32* %a.ptr, i32* %b.ptr) {