diff --git a/llvm/include/llvm/Analysis/Lint.h b/llvm/include/llvm/Analysis/Lint.h index 4ceae2d29f166..8dffa1ecb5f38 100644 --- a/llvm/include/llvm/Analysis/Lint.h +++ b/llvm/include/llvm/Analysis/Lint.h @@ -22,12 +22,9 @@ namespace llvm { -class FunctionPass; class Module; class Function; -FunctionPass *createLintLegacyPassPass(); - /// Lint a module. /// /// This should only be used for debugging, because it plays games with diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 9d2bc7ae255ca..9b98484c37cfd 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -180,7 +180,6 @@ void initializeLegacyLoopSinkPassPass(PassRegistry&); void initializeLegalizerPass(PassRegistry&); void initializeGISelCSEAnalysisWrapperPassPass(PassRegistry &); void initializeGISelKnownBitsAnalysisPass(PassRegistry &); -void initializeLintLegacyPassPass(PassRegistry &); void initializeLiveDebugValuesPass(PassRegistry&); void initializeLiveDebugVariablesPass(PassRegistry&); void initializeLiveIntervalsPass(PassRegistry&); diff --git a/llvm/include/llvm/LinkAllPasses.h b/llvm/include/llvm/LinkAllPasses.h index 1fb83b72ae047..ef1db9d654d26 100644 --- a/llvm/include/llvm/LinkAllPasses.h +++ b/llvm/include/llvm/LinkAllPasses.h @@ -148,7 +148,6 @@ namespace { (void) llvm::createPrintModulePass(os); (void) llvm::createPrintFunctionPass(os); (void) llvm::createModuleDebugInfoPrinterPass(); - (void) llvm::createLintLegacyPassPass(); (void) llvm::createSinkingPass(); (void) llvm::createLowerAtomicPass(); (void) llvm::createMemDepPrinter(); diff --git a/llvm/lib/Analysis/Analysis.cpp b/llvm/lib/Analysis/Analysis.cpp index adb81ecb65e9d..7fe2088e38c65 100644 --- a/llvm/lib/Analysis/Analysis.cpp +++ b/llvm/lib/Analysis/Analysis.cpp @@ -53,7 +53,6 @@ void llvm::initializeAnalysis(PassRegistry &Registry) { initializeLazyBlockFrequencyInfoPassPass(Registry); initializeLazyValueInfoWrapperPassPass(Registry); initializeLazyValueInfoPrinterPass(Registry); - initializeLintLegacyPassPass(Registry); initializeLoopInfoWrapperPassPass(Registry); initializeMemDepPrinterPass(Registry); initializeMemDerefPrinterPass(Registry); diff --git a/llvm/lib/Analysis/Lint.cpp b/llvm/lib/Analysis/Lint.cpp index d3120a41ac270..17bb375277d36 100644 --- a/llvm/lib/Analysis/Lint.cpp +++ b/llvm/lib/Analysis/Lint.cpp @@ -40,11 +40,14 @@ #include "llvm/ADT/Twine.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/AssumptionCache.h" +#include "llvm/Analysis/BasicAliasAnalysis.h" #include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Analysis/Loads.h" #include "llvm/Analysis/MemoryLocation.h" +#include "llvm/Analysis/ScopedNoAliasAA.h" #include "llvm/Analysis/TargetLibraryInfo.h" +#include "llvm/Analysis/TypeBasedAliasAnalysis.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/Argument.h" #include "llvm/IR/BasicBlock.h" @@ -715,73 +718,35 @@ PreservedAnalyses LintPass::run(Function &F, FunctionAnalysisManager &AM) { return PreservedAnalyses::all(); } -namespace { -class LintLegacyPass : public FunctionPass { -public: - static char ID; // Pass identification, replacement for typeid - LintLegacyPass() : FunctionPass(ID) { - initializeLintLegacyPassPass(*PassRegistry::getPassRegistry()); - } - - bool runOnFunction(Function &F) override; - - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.setPreservesAll(); - AU.addRequired(); - AU.addRequired(); - AU.addRequired(); - AU.addRequired(); - } - void print(raw_ostream &O, const Module *M) const override {} -}; -} // namespace - -char LintLegacyPass::ID = 0; -INITIALIZE_PASS_BEGIN(LintLegacyPass, "lint", "Statically lint-checks LLVM IR", - false, true) -INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) -INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) -INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) -INITIALIZE_PASS_END(LintLegacyPass, "lint", "Statically lint-checks LLVM IR", - false, true) - -bool LintLegacyPass::runOnFunction(Function &F) { - auto *Mod = F.getParent(); - auto *DL = &F.getParent()->getDataLayout(); - auto *AA = &getAnalysis().getAAResults(); - auto *AC = &getAnalysis().getAssumptionCache(F); - auto *DT = &getAnalysis().getDomTree(); - auto *TLI = &getAnalysis().getTLI(F); - Lint L(Mod, DL, AA, AC, DT, TLI); - L.visit(F); - dbgs() << L.MessagesStr.str(); - return false; -} - //===----------------------------------------------------------------------===// // Implement the public interfaces to this file... //===----------------------------------------------------------------------===// -FunctionPass *llvm::createLintLegacyPassPass() { return new LintLegacyPass(); } - /// lintFunction - Check a function for errors, printing messages on stderr. /// void llvm::lintFunction(const Function &f) { Function &F = const_cast(f); assert(!F.isDeclaration() && "Cannot lint external functions"); - legacy::FunctionPassManager FPM(F.getParent()); - auto *V = new LintLegacyPass(); - FPM.add(V); - FPM.run(F); + FunctionAnalysisManager FAM; + FAM.registerPass([&] { return TargetLibraryAnalysis(); }); + FAM.registerPass([&] { return DominatorTreeAnalysis(); }); + FAM.registerPass([&] { return AssumptionAnalysis(); }); + FAM.registerPass([&] { + AAManager AA; + AA.registerFunctionAnalysis(); + AA.registerFunctionAnalysis(); + AA.registerFunctionAnalysis(); + return AA; + }); + LintPass().run(F, FAM); } /// lintModule - Check a module for errors, printing messages on stderr. /// void llvm::lintModule(const Module &M) { - legacy::PassManager PM; - auto *V = new LintLegacyPass(); - PM.add(V); - PM.run(const_cast(M)); + for (const Function &F : M) { + if (!F.isDeclaration()) + lintFunction(F); + } }