Index: llvm/include/llvm/Analysis/DependenceAnalysis.h =================================================================== --- llvm/include/llvm/Analysis/DependenceAnalysis.h +++ llvm/include/llvm/Analysis/DependenceAnalysis.h @@ -275,6 +275,10 @@ LoopInfo *LI) : AA(AA), SE(SE), LI(LI), F(F) {} + /// Handle transitive invalidation when the cached analysis results go away. + bool invalidate(Function &F, const PreservedAnalyses &PA, + FunctionAnalysisManager::Invalidator &Inv); + /// depends - Tests for a dependence between the Src and Dst instructions. /// Returns NULL if no dependence; otherwise, returns a Dependence (or a /// FullDependence) with as much information as can be gleaned. @@ -936,6 +940,17 @@ friend struct AnalysisInfoMixin; }; // class DependenceAnalysis + /// Printer pass to dump DA results. + struct DependenceAnalysisPrinterPass + : public PassInfoMixin { + DependenceAnalysisPrinterPass(raw_ostream &OS) : OS(OS) {} + + PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM); + + private: + raw_ostream &OS; + }; // class DependenceAnalysis + /// Legacy pass manager pass to access dependence information class DependenceAnalysisWrapperPass : public FunctionPass { public: Index: llvm/lib/Analysis/DependenceAnalysis.cpp =================================================================== --- llvm/lib/Analysis/DependenceAnalysis.cpp +++ llvm/lib/Analysis/DependenceAnalysis.cpp @@ -194,6 +194,13 @@ dumpExampleDependence(OS, info.get()); } +PreservedAnalyses +DependenceAnalysisPrinterPass::run(Function &F, FunctionAnalysisManager &FAM) { + OS << "'Dependence Analysis' for function '" << F.getName() << "':\n"; + dumpExampleDependence(OS, &FAM.getResult(F)); + return PreservedAnalyses::all(); +} + //===----------------------------------------------------------------------===// // Dependence methods @@ -3362,6 +3369,19 @@ } #endif +bool DependenceInfo::invalidate(Function &F, const PreservedAnalyses &PA, + FunctionAnalysisManager::Invalidator &Inv) { + // Check if the analysis itself has been invalidated. + auto PAC = PA.getChecker(); + if (!PAC.preserved() && !PAC.preservedSet>()) + return true; + + // Check transitive dependencies. + return Inv.invalidate(F, PA) || + Inv.invalidate(F, PA) || + Inv.invalidate(F, PA); +} + // depends - // Returns NULL if there is no dependence. // Otherwise, return a Dependence with as many details as possible. Index: llvm/lib/Passes/PassRegistry.def =================================================================== --- llvm/lib/Passes/PassRegistry.def +++ llvm/lib/Passes/PassRegistry.def @@ -211,6 +211,7 @@ FUNCTION_PASS("print", RegionInfoPrinterPass(dbgs())) FUNCTION_PASS("print", ScalarEvolutionPrinterPass(dbgs())) FUNCTION_PASS("print", StackSafetyPrinterPass(dbgs())) +FUNCTION_PASS("print", DependenceAnalysisPrinterPass(dbgs())) FUNCTION_PASS("reassociate", ReassociatePass()) FUNCTION_PASS("scalarizer", ScalarizerPass()) FUNCTION_PASS("sccp", SCCPPass()) Index: llvm/test/Analysis/DependenceAnalysis/AA.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/AA.ll +++ llvm/test/Analysis/DependenceAnalysis/AA.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" \ +; RUN: "-aa-pipeline=basic-aa,type-based-aa" 2>&1 | FileCheck %s ; RUN: opt < %s -analyze -basicaa -tbaa -da | FileCheck %s ; CHECK-LABEL: 'Dependence Analysis' for function 'test_no_noalias' Index: llvm/test/Analysis/DependenceAnalysis/Banerjee.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/Banerjee.ll +++ llvm/test/Analysis/DependenceAnalysis/Banerjee.ll @@ -1,4 +1,8 @@ +; RUN: opt < %s -disable-output -da-delinearize=false "-passes=print" \ +; RUN: -aa-pipeline=basic-aa 2>&1 | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da -da-delinearize=false | FileCheck %s +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s -check-prefix=DELIN ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s -check-prefix=DELIN target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" Index: llvm/test/Analysis/DependenceAnalysis/BasePtrBug.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/BasePtrBug.ll +++ llvm/test/Analysis/DependenceAnalysis/BasePtrBug.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s ; Test that the dependence analysis generates the correct results when using Index: llvm/test/Analysis/DependenceAnalysis/Constraints.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/Constraints.ll +++ llvm/test/Analysis/DependenceAnalysis/Constraints.ll @@ -1,3 +1,4 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 ; RUN: opt < %s -analyze -basicaa -da ;; Check that this code doesn't abort. Test case is reduced version of lnt Polybench benchmark test case dynprog. Index: llvm/test/Analysis/DependenceAnalysis/Coupled.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/Coupled.ll +++ llvm/test/Analysis/DependenceAnalysis/Coupled.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" Index: llvm/test/Analysis/DependenceAnalysis/DADelin.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/DADelin.ll +++ llvm/test/Analysis/DependenceAnalysis/DADelin.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" Index: llvm/test/Analysis/DependenceAnalysis/ExactRDIV.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/ExactRDIV.ll +++ llvm/test/Analysis/DependenceAnalysis/ExactRDIV.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s ; ModuleID = 'ExactRDIV.bc' Index: llvm/test/Analysis/DependenceAnalysis/ExactSIV.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/ExactSIV.ll +++ llvm/test/Analysis/DependenceAnalysis/ExactSIV.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" Index: llvm/test/Analysis/DependenceAnalysis/GCD.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/GCD.ll +++ llvm/test/Analysis/DependenceAnalysis/GCD.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s -check-prefix=DELIN ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s -check-prefix=DELIN target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" Index: llvm/test/Analysis/DependenceAnalysis/Invariant.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/Invariant.ll +++ llvm/test/Analysis/DependenceAnalysis/Invariant.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s ; Test for a bug, which caused an assert when an invalid Index: llvm/test/Analysis/DependenceAnalysis/MIVCheckConst.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/MIVCheckConst.ll +++ llvm/test/Analysis/DependenceAnalysis/MIVCheckConst.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -analyze -basicaa -da +; RUN: opt < %s -passes="print" ; Test that the dependence analysis pass does seg-fault due to a null pointer ; dereference. The code in gcdMIVTest requires a null check for the result of Index: llvm/test/Analysis/DependenceAnalysis/NonAffineExpr.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/NonAffineExpr.ll +++ llvm/test/Analysis/DependenceAnalysis/NonAffineExpr.ll @@ -1,3 +1,4 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 ; RUN: opt < %s -analyze -basicaa -da ; ; CHECK: da analyze - consistent input [S S]! Index: llvm/test/Analysis/DependenceAnalysis/NonCanonicalizedSubscript.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/NonCanonicalizedSubscript.ll +++ llvm/test/Analysis/DependenceAnalysis/NonCanonicalizedSubscript.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s -check-prefix=DELIN ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s -check-prefix=DELIN target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" Index: llvm/test/Analysis/DependenceAnalysis/PR21585.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/PR21585.ll +++ llvm/test/Analysis/DependenceAnalysis/PR21585.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" \ +; RUN: "-aa-pipeline=basic-aa,globals-aa" 2>&1 | FileCheck %s ; RUN: opt < %s -analyze -basicaa -globals-aa -da | FileCheck %s define void @i32_subscript(i32* %a) { entry: Index: llvm/test/Analysis/DependenceAnalysis/Preliminary.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/Preliminary.ll +++ llvm/test/Analysis/DependenceAnalysis/Preliminary.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" Index: llvm/test/Analysis/DependenceAnalysis/Propagating.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/Propagating.ll +++ llvm/test/Analysis/DependenceAnalysis/Propagating.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" Index: llvm/test/Analysis/DependenceAnalysis/Separability.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/Separability.ll +++ llvm/test/Analysis/DependenceAnalysis/Separability.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" Index: llvm/test/Analysis/DependenceAnalysis/StrongSIV.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/StrongSIV.ll +++ llvm/test/Analysis/DependenceAnalysis/StrongSIV.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" Index: llvm/test/Analysis/DependenceAnalysis/SymbolicRDIV.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/SymbolicRDIV.ll +++ llvm/test/Analysis/DependenceAnalysis/SymbolicRDIV.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s ; ModuleID = 'SymbolicRDIV.bc' Index: llvm/test/Analysis/DependenceAnalysis/SymbolicSIV.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/SymbolicSIV.ll +++ llvm/test/Analysis/DependenceAnalysis/SymbolicSIV.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" Index: llvm/test/Analysis/DependenceAnalysis/UsefulGEP.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/UsefulGEP.ll +++ llvm/test/Analysis/DependenceAnalysis/UsefulGEP.ll @@ -1,3 +1,4 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 ; RUN: opt < %s -analyze -basicaa -da ;; Check this doesn't crash. target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" Index: llvm/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll +++ llvm/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s ; ModuleID = 'WeakCrossingSIV.bc' Index: llvm/test/Analysis/DependenceAnalysis/WeakZeroDstSIV.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/WeakZeroDstSIV.ll +++ llvm/test/Analysis/DependenceAnalysis/WeakZeroDstSIV.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s ; ModuleID = 'WeakZeroDstSIV.bc' Index: llvm/test/Analysis/DependenceAnalysis/WeakZeroSrcSIV.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/WeakZeroSrcSIV.ll +++ llvm/test/Analysis/DependenceAnalysis/WeakZeroSrcSIV.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s ; ModuleID = 'WeakZeroSrcSIV.bc' Index: llvm/test/Analysis/DependenceAnalysis/ZIV.ll =================================================================== --- llvm/test/Analysis/DependenceAnalysis/ZIV.ll +++ llvm/test/Analysis/DependenceAnalysis/ZIV.ll @@ -1,3 +1,5 @@ +; RUN: opt < %s -disable-output "-passes=print" -aa-pipeline=basic-aa 2>&1 \ +; RUN: | FileCheck %s ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s ; ModuleID = 'ZIV.bc' Index: llvm/test/Analysis/DependenceAnalysis/new-pm-invalidation.ll =================================================================== --- /dev/null +++ llvm/test/Analysis/DependenceAnalysis/new-pm-invalidation.ll @@ -0,0 +1,16 @@ +; RUN: opt < %s -passes='require,invalidate,print' \ +; RUN: -disable-output -debug-pass-manager 2>&1 | FileCheck %s + +; CHECK: Running analysis: DependenceAnalysis on test_no_noalias +; CHECK: Running analysis: ScalarEvolutionAnalysis on test_no_noalias +; CHECK: Invalidating analysis: ScalarEvolutionAnalysis on test_no_noalias +; CHECK: Invalidating analysis: DependenceAnalysis on test_no_noalias +; CHECK: Running analysis: DependenceAnalysis on test_no_noalias +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +define void @test_no_noalias(i32* %A, i32* %B) { + store i32 1, i32* %A + store i32 2, i32* %B + ret void +}