diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-06-13 19:31:46 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-06-13 19:37:19 +0000 | 
| commit | e8d8bef961a50d4dc22501cde4fb9fb0be1b2532 (patch) | |
| tree | 94f04805f47bb7c59ae29690d8952b6074fff602 /contrib/llvm-project/llvm/lib/Analysis/MustExecute.cpp | |
| parent | bb130ff39747b94592cb26d71b7cb097b9a4ea6b (diff) | |
| parent | b60736ec1405bb0a8dd40989f67ef4c93da068ab (diff) | |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Analysis/MustExecute.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Analysis/MustExecute.cpp | 98 | 
1 files changed, 70 insertions, 28 deletions
diff --git a/contrib/llvm-project/llvm/lib/Analysis/MustExecute.cpp b/contrib/llvm-project/llvm/lib/Analysis/MustExecute.cpp index 6e3ff67bdddb..1e7626013eed 100644 --- a/contrib/llvm-project/llvm/lib/Analysis/MustExecute.cpp +++ b/contrib/llvm-project/llvm/lib/Analysis/MustExecute.cpp @@ -16,9 +16,11 @@  #include "llvm/Analysis/ValueTracking.h"  #include "llvm/IR/AssemblyAnnotationWriter.h"  #include "llvm/IR/DataLayout.h" +#include "llvm/IR/Dominators.h"  #include "llvm/IR/InstIterator.h"  #include "llvm/IR/LLVMContext.h"  #include "llvm/IR/Module.h" +#include "llvm/IR/PassManager.h"  #include "llvm/InitializePasses.h"  #include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/FormattedStream.h" @@ -300,30 +302,31 @@ bool ICFLoopSafetyInfo::doesNotWriteMemoryBefore(const Instruction &I,  }  namespace { -  struct MustExecutePrinter : public FunctionPass { +struct MustExecutePrinter : public FunctionPass { -    static char ID; // Pass identification, replacement for typeid -    MustExecutePrinter() : FunctionPass(ID) { -      initializeMustExecutePrinterPass(*PassRegistry::getPassRegistry()); -    } -    void getAnalysisUsage(AnalysisUsage &AU) const override { -      AU.setPreservesAll(); -      AU.addRequired<DominatorTreeWrapperPass>(); -      AU.addRequired<LoopInfoWrapperPass>(); -    } -    bool runOnFunction(Function &F) override; -  }; -  struct MustBeExecutedContextPrinter : public ModulePass { -    static char ID; +  static char ID; // Pass identification, replacement for typeid +  MustExecutePrinter() : FunctionPass(ID) { +    initializeMustExecutePrinterPass(*PassRegistry::getPassRegistry()); +  } +  void getAnalysisUsage(AnalysisUsage &AU) const override { +    AU.setPreservesAll(); +    AU.addRequired<DominatorTreeWrapperPass>(); +    AU.addRequired<LoopInfoWrapperPass>(); +  } +  bool runOnFunction(Function &F) override; +}; +struct MustBeExecutedContextPrinter : public ModulePass { +  static char ID; -    MustBeExecutedContextPrinter() : ModulePass(ID) { -      initializeMustBeExecutedContextPrinterPass(*PassRegistry::getPassRegistry()); -    } -    void getAnalysisUsage(AnalysisUsage &AU) const override { -      AU.setPreservesAll(); -    } -    bool runOnModule(Module &M) override; -  }; +  MustBeExecutedContextPrinter() : ModulePass(ID) { +    initializeMustBeExecutedContextPrinterPass( +        *PassRegistry::getPassRegistry()); +  } +  void getAnalysisUsage(AnalysisUsage &AU) const override { +    AU.setPreservesAll(); +  } +  bool runOnModule(Module &M) override; +};  }  char MustExecutePrinter::ID = 0; @@ -339,15 +342,16 @@ FunctionPass *llvm::createMustExecutePrinter() {  }  char MustBeExecutedContextPrinter::ID = 0; -INITIALIZE_PASS_BEGIN( -    MustBeExecutedContextPrinter, "print-must-be-executed-contexts", -    "print the must-be-executed-contexed for all instructions", false, true) +INITIALIZE_PASS_BEGIN(MustBeExecutedContextPrinter, +                      "print-must-be-executed-contexts", +                      "print the must-be-executed-context for all instructions", +                      false, true)  INITIALIZE_PASS_DEPENDENCY(PostDominatorTreeWrapperPass)  INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)  INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)  INITIALIZE_PASS_END(MustBeExecutedContextPrinter,                      "print-must-be-executed-contexts", -                    "print the must-be-executed-contexed for all instructions", +                    "print the must-be-executed-context for all instructions",                      false, true)  ModulePass *llvm::createMustBeExecutedContextPrinter() { @@ -627,8 +631,7 @@ MustBeExecutedContextExplorer::findForwardJoinPoint(const BasicBlock *InitBB) {        if (!TransfersExecution)          return nullptr; -      for (const BasicBlock *AdjacentBB : successors(ToBB)) -        Worklist.push_back(AdjacentBB); +      append_range(Worklist, successors(ToBB));      }    } @@ -835,3 +838,42 @@ const Instruction *MustBeExecutedIterator::advance() {    Tail = nullptr;    return nullptr;  } + +PreservedAnalyses MustExecutePrinterPass::run(Function &F, +                                              FunctionAnalysisManager &AM) { +  auto &LI = AM.getResult<LoopAnalysis>(F); +  auto &DT = AM.getResult<DominatorTreeAnalysis>(F); + +  MustExecuteAnnotatedWriter Writer(F, DT, LI); +  F.print(OS, &Writer); +  return PreservedAnalyses::all(); +} + +PreservedAnalyses +MustBeExecutedContextPrinterPass::run(Module &M, ModuleAnalysisManager &AM) { +  FunctionAnalysisManager &FAM = +      AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); +  GetterTy<const LoopInfo> LIGetter = [&](const Function &F) { +    return &FAM.getResult<LoopAnalysis>(const_cast<Function &>(F)); +  }; +  GetterTy<const DominatorTree> DTGetter = [&](const Function &F) { +    return &FAM.getResult<DominatorTreeAnalysis>(const_cast<Function &>(F)); +  }; +  GetterTy<const PostDominatorTree> PDTGetter = [&](const Function &F) { +    return &FAM.getResult<PostDominatorTreeAnalysis>(const_cast<Function &>(F)); +  }; + +  MustBeExecutedContextExplorer Explorer( +      /* ExploreInterBlock */ true, +      /* ExploreCFGForward */ true, +      /* ExploreCFGBackward */ true, LIGetter, DTGetter, PDTGetter); + +  for (Function &F : M) { +    for (Instruction &I : instructions(F)) { +      OS << "-- Explore context of: " << I << "\n"; +      for (const Instruction *CI : Explorer.range(&I)) +        OS << "  [F: " << CI->getFunction()->getName() << "] " << *CI << "\n"; +    } +  } +  return PreservedAnalyses::all(); +}  | 
