diff options
| author | Xinliang David Li <davidxl@google.com> | 2016-07-02 21:18:40 +0000 |
|---|---|---|
| committer | Xinliang David Li <davidxl@google.com> | 2016-07-02 21:18:40 +0000 |
| commit | 8a021317a2b316fa258afc669c581ac181468882 (patch) | |
| tree | 911472d8ba1a62d2ff22fa48f8cb4ef06738e547 | |
| parent | a7329dac6f7582bf63e97aacd11024bdbd18f049 (diff) | |
| download | bcm5719-llvm-8a021317a2b316fa258afc669c581ac181468882.tar.gz bcm5719-llvm-8a021317a2b316fa258afc669c581ac181468882.zip | |
[PM] Port LoopAccessInfo analysis to new PM
It is implemented as a LoopAnalysis pass as
discussed and agreed upon.
llvm-svn: 274452
25 files changed, 75 insertions, 1 deletions
diff --git a/llvm/include/llvm/Analysis/LoopAccessAnalysis.h b/llvm/include/llvm/Analysis/LoopAccessAnalysis.h index 14b4fa4057a..5acc5a9fc7f 100644 --- a/llvm/include/llvm/Analysis/LoopAccessAnalysis.h +++ b/llvm/include/llvm/Analysis/LoopAccessAnalysis.h @@ -772,6 +772,28 @@ private: LoopInfo *LI; }; +/// \brief LoopAccessInfoAnalysis +class LoopAccessInfoAnalysis + : public AnalysisInfoMixin<LoopAccessInfoAnalysis> { + friend AnalysisInfoMixin<LoopAccessInfoAnalysis>; + static char PassID; + +public: + typedef LoopAccessInfo Result; + Result run(Loop &, AnalysisManager<Loop> &); + static StringRef name() { return "LoopAccessInfoAnalysis"; } +}; + +/// \brief Printer pass for the \c BlockFrequencyInfo results. +class LoopAccessInfoPrinterPass + : public PassInfoMixin<LoopAccessInfoPrinterPass> { + raw_ostream &OS; + +public: + explicit LoopAccessInfoPrinterPass(raw_ostream &OS) : OS(OS) {} + PreservedAnalyses run(Loop &L, AnalysisManager<Loop> &AM); +}; + inline Instruction *MemoryDepChecker::Dependence::getSource( const LoopAccessInfo &LAI) const { return LAI.getDepChecker().getMemoryInstructions()[Source]; diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp index cff78839b62..92d642fd11d 100644 --- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp +++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp @@ -14,6 +14,7 @@ #include "llvm/Analysis/LoopAccessAnalysis.h" #include "llvm/Analysis/LoopInfo.h" +#include "llvm/Analysis/LoopPassManager.h" #include "llvm/Analysis/ScalarEvolutionExpander.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/ValueTracking.h" @@ -21,6 +22,7 @@ #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/IRBuilder.h" +#include "llvm/IR/PassManager.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; @@ -2022,6 +2024,32 @@ INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) INITIALIZE_PASS_END(LoopAccessAnalysis, LAA_NAME, laa_name, false, true) +char LoopAccessInfoAnalysis::PassID; + +LoopAccessInfo LoopAccessInfoAnalysis::run(Loop &L, AnalysisManager<Loop> &AM) { + // FIXME: ugly const cast + AnalysisManager<Function> &FAM = const_cast<FunctionAnalysisManager &>( + AM.getResult<FunctionAnalysisManagerLoopProxy>(L).getManager()); + Function &F = *L.getHeader()->getParent(); + auto *SE = &FAM.getResult<ScalarEvolutionAnalysis>(F); + auto *TLI = FAM.getCachedResult<TargetLibraryAnalysis>(F); + auto *AA = &FAM.getResult<AAManager>(F); + auto *DT = &FAM.getResult<DominatorTreeAnalysis>(F); + auto *LI = &FAM.getResult<LoopAnalysis>(F); + const DataLayout &DL = F.getParent()->getDataLayout(); + return LoopAccessInfo(&L, SE, DL, TLI, AA, DT, LI); +} + +PreservedAnalyses LoopAccessInfoPrinterPass::run(Loop &L, + AnalysisManager<Loop> &AM) { + Function &F = *L.getHeader()->getParent(); + auto &LAI = AM.getResult<LoopAccessInfoAnalysis>(L); + OS << "Loop access info in function '" << F.getName() << "':\n"; + OS.indent(2) << L.getHeader()->getName() << ":\n"; + LAI.print(OS, 4); + return PreservedAnalyses::all(); +} + namespace llvm { Pass *createLAAPass() { return new LoopAccessAnalysis(); diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 93d672d95fc..fe9e4cffcbd 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -33,6 +33,7 @@ #include "llvm/Analysis/GlobalsModRef.h" #include "llvm/Analysis/LazyCallGraph.h" #include "llvm/Analysis/LazyValueInfo.h" +#include "llvm/Analysis/LoopAccessAnalysis.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/MemoryDependenceAnalysis.h" #include "llvm/Analysis/PostDominators.h" diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 950cffc4bdd..b1c9d6d815e 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -171,6 +171,7 @@ FUNCTION_PASS("verify<regions>", RegionInfoVerifierPass()) #define LOOP_ANALYSIS(NAME, CREATE_PASS) #endif LOOP_ANALYSIS("no-op-loop", NoOpLoopAnalysis()) +LOOP_ANALYSIS("access-info", LoopAccessInfoAnalysis()) #undef LOOP_ANALYSIS #ifndef LOOP_PASS @@ -182,4 +183,5 @@ LOOP_PASS("no-op-loop", NoOpLoopPass()) LOOP_PASS("print", PrintLoopPass(dbgs())) LOOP_PASS("simplify-cfg", LoopSimplifyCFGPass()) LOOP_PASS("indvars", IndVarSimplifyPass()) +LOOP_PASS("print-access-info", LoopAccessInfoPrinterPass(dbgs())) #undef LOOP_PASS diff --git a/llvm/test/Analysis/LoopAccessAnalysis/backward-dep-different-types.ll b/llvm/test/Analysis/LoopAccessAnalysis/backward-dep-different-types.ll index 5d4fb7d3d66..96335caa637 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/backward-dep-different-types.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/backward-dep-different-types.ll @@ -1,4 +1,5 @@ ; RUN: opt -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; In this loop just because we access A through different types (int, float) ; we still have a dependence cycle: diff --git a/llvm/test/Analysis/LoopAccessAnalysis/forward-loop-carried.ll b/llvm/test/Analysis/LoopAccessAnalysis/forward-loop-carried.ll index e18ec2357fd..6e3110091f2 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/forward-loop-carried.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/forward-loop-carried.ll @@ -1,4 +1,5 @@ ; RUN: opt -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; for (unsigned i = 0; i < 100; i++) { ; A[i+8] = B[i] + 2; diff --git a/llvm/test/Analysis/LoopAccessAnalysis/forward-loop-independent.ll b/llvm/test/Analysis/LoopAccessAnalysis/forward-loop-independent.ll index e1ba674ce80..a74627e7951 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/forward-loop-independent.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/forward-loop-independent.ll @@ -1,4 +1,5 @@ ; RUN: opt -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; Check that loop-indepedent forward dependences are discovered properly. ; diff --git a/llvm/test/Analysis/LoopAccessAnalysis/independent-interleaved.ll b/llvm/test/Analysis/LoopAccessAnalysis/independent-interleaved.ll index 1be6ee6dc70..e09429afe5d 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/independent-interleaved.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/independent-interleaved.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -store-to-load-forwarding-conflict-detection=false -loop-accesses -analyze | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -store-to-load-forwarding-conflict-detection=false -disable-output < %s 2>&1 | FileCheck %s ; This test checks that we prove the strided accesses to be independent before ; concluding that there is a forward dependence. diff --git a/llvm/test/Analysis/LoopAccessAnalysis/memcheck-for-loop-invariant.ll b/llvm/test/Analysis/LoopAccessAnalysis/memcheck-for-loop-invariant.ll index a39a1741048..a74b23a4167 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/memcheck-for-loop-invariant.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/memcheck-for-loop-invariant.ll @@ -1,4 +1,5 @@ ; RUN: opt -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; Handle memchecks involving loop-invariant addresses: ; diff --git a/llvm/test/Analysis/LoopAccessAnalysis/multiple-strides-rt-memory-checks.ll b/llvm/test/Analysis/LoopAccessAnalysis/multiple-strides-rt-memory-checks.ll index fe074a63ee1..c7bdf169019 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/multiple-strides-rt-memory-checks.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/multiple-strides-rt-memory-checks.ll @@ -1,4 +1,5 @@ ; RUN: opt -loop-accesses -analyze -S < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; This is the test case from PR26314. ; When we were retrying dependence checking with memchecks only, diff --git a/llvm/test/Analysis/LoopAccessAnalysis/non-wrapping-pointer.ll b/llvm/test/Analysis/LoopAccessAnalysis/non-wrapping-pointer.ll index 0de1cd1bea6..e995cb63fc0 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/non-wrapping-pointer.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/non-wrapping-pointer.ll @@ -1,4 +1,5 @@ ; RUN: opt -basicaa -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='require<aa>,loop(print-access-info)' -aa-pipeline='basic-aa' -disable-output < %s 2>&1 | FileCheck %s ; For this loop: ; for (int i = 0; i < n; i++) diff --git a/llvm/test/Analysis/LoopAccessAnalysis/nullptr.ll b/llvm/test/Analysis/LoopAccessAnalysis/nullptr.ll index a72b48cc352..83466ce889b 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/nullptr.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/nullptr.ll @@ -1,4 +1,5 @@ ; RUN: opt -loop-accesses -analyze %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; Test that the loop accesses are proven safe in this case. ; The analyzer uses to be confused by the "diamond" because GetUnderlyingObjects diff --git a/llvm/test/Analysis/LoopAccessAnalysis/number-of-memchecks.ll b/llvm/test/Analysis/LoopAccessAnalysis/number-of-memchecks.ll index c246d066ffa..cbd8a3e5844 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/number-of-memchecks.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/number-of-memchecks.ll @@ -1,4 +1,5 @@ ; RUN: opt -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128" target triple = "aarch64--linux-gnueabi" diff --git a/llvm/test/Analysis/LoopAccessAnalysis/pointer-with-unknown-bounds.ll b/llvm/test/Analysis/LoopAccessAnalysis/pointer-with-unknown-bounds.ll index 20b7fb2c633..ae52a55ffad 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/pointer-with-unknown-bounds.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/pointer-with-unknown-bounds.ll @@ -1,4 +1,5 @@ ; RUN: opt -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" diff --git a/llvm/test/Analysis/LoopAccessAnalysis/resort-to-memchecks-only.ll b/llvm/test/Analysis/LoopAccessAnalysis/resort-to-memchecks-only.ll index 9412028fc70..de8b50e90f5 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/resort-to-memchecks-only.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/resort-to-memchecks-only.ll @@ -1,4 +1,5 @@ ; RUN: opt -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; We give up analyzing the dependences in this loop due to non-constant ; distance between A[i+offset] and A[i] and add memchecks to prove diff --git a/llvm/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll b/llvm/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll index 0a0194f8abb..556eaddd3ea 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll @@ -1,4 +1,5 @@ ; RUN: opt -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; The runtime memory check code and the access grouping ; algorithm both assume that the start and end values diff --git a/llvm/test/Analysis/LoopAccessAnalysis/safe-no-checks.ll b/llvm/test/Analysis/LoopAccessAnalysis/safe-no-checks.ll index d85258f75aa..8ef5b05fb50 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/safe-no-checks.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/safe-no-checks.ll @@ -1,4 +1,5 @@ ; RUN: opt -basicaa -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='require<aa>,loop(print-access-info)' -aa-pipeline='basic-aa' -disable-output < %s 2>&1 | FileCheck %s ; If the arrays don't alias this loop is safe with no memchecks: ; for (i = 0; i < n; i++) diff --git a/llvm/test/Analysis/LoopAccessAnalysis/safe-with-dep-distance.ll b/llvm/test/Analysis/LoopAccessAnalysis/safe-with-dep-distance.ll index b3a82ff1be4..2025fad00a9 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/safe-with-dep-distance.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/safe-with-dep-distance.ll @@ -1,4 +1,5 @@ ; RUN: opt -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; Analyze this loop: ; for (i = 0; i < n; i++) diff --git a/llvm/test/Analysis/LoopAccessAnalysis/store-to-invariant-check2.ll b/llvm/test/Analysis/LoopAccessAnalysis/store-to-invariant-check2.ll index 4da09068949..29fcea3903d 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/store-to-invariant-check2.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/store-to-invariant-check2.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -loop-accesses -analyze | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; Test to confirm LAA will not find store to invariant address. ; Inner loop has no store to invariant address. diff --git a/llvm/test/Analysis/LoopAccessAnalysis/store-to-invariant-check3.ll b/llvm/test/Analysis/LoopAccessAnalysis/store-to-invariant-check3.ll index 18315a59dc3..f2892189659 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/store-to-invariant-check3.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/store-to-invariant-check3.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -loop-accesses -analyze | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; Test to confirm LAA will find store to invariant address. ; Inner loop has a store to invariant address. diff --git a/llvm/test/Analysis/LoopAccessAnalysis/stride-access-dependence.ll b/llvm/test/Analysis/LoopAccessAnalysis/stride-access-dependence.ll index 5fc353e70cf..8e6a9e27d7e 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/stride-access-dependence.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/stride-access-dependence.ll @@ -1,4 +1,5 @@ ; RUN: opt -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128" @@ -384,7 +385,7 @@ for.body: ; preds = %entry, %for.body ; return sum; ; } -; CHECK: for function 'vectorizable_unscaled_Write_Read': +; CHECK: function 'vectorizable_unscaled_Write_Read': ; CHECK-NEXT: for.body: ; CHECK-NEXT: Memory dependences are safe ; CHECK-NEXT: Dependences: diff --git a/llvm/test/Analysis/LoopAccessAnalysis/underlying-objects-1.ll b/llvm/test/Analysis/LoopAccessAnalysis/underlying-objects-1.ll index 44820ed3722..cf4418061a9 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/underlying-objects-1.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/underlying-objects-1.ll @@ -1,4 +1,5 @@ ; RUN: opt -basicaa -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; In: ; diff --git a/llvm/test/Analysis/LoopAccessAnalysis/underlying-objects-2.ll b/llvm/test/Analysis/LoopAccessAnalysis/underlying-objects-2.ll index d388151365f..e140b254a32 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/underlying-objects-2.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/underlying-objects-2.ll @@ -1,4 +1,5 @@ ; RUN: opt -basicaa -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; This loop: ; diff --git a/llvm/test/Analysis/LoopAccessAnalysis/unsafe-and-rt-checks.ll b/llvm/test/Analysis/LoopAccessAnalysis/unsafe-and-rt-checks.ll index 7157b954c5b..49e2ed43c8c 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/unsafe-and-rt-checks.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/unsafe-and-rt-checks.ll @@ -1,4 +1,5 @@ ; RUN: opt -loop-accesses -analyze < %s | FileCheck %s +; RUN: opt -passes='loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s ; Analyze this loop: ; for (i = 0; i < n; i++) diff --git a/llvm/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll b/llvm/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll index 5f305cebc27..beb94cfe9ea 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll @@ -1,4 +1,5 @@ ; RUN: opt -basicaa -loop-accesses -analyze < %s | FileCheck %s -check-prefix=LAA +; RUN: opt -passes='require<aa>,loop(print-access-info)' -aa-pipeline='basic-aa' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=LAA ; RUN: opt -loop-versioning -S < %s | FileCheck %s -check-prefix=LV target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" |

