diff options
Diffstat (limited to 'llvm/include')
-rw-r--r-- | llvm/include/llvm/Analysis/OptimizationDiagnosticInfo.h | 52 | ||||
-rw-r--r-- | llvm/include/llvm/InitializePasses.h | 2 |
2 files changed, 46 insertions, 8 deletions
diff --git a/llvm/include/llvm/Analysis/OptimizationDiagnosticInfo.h b/llvm/include/llvm/Analysis/OptimizationDiagnosticInfo.h index 04e49a78e26..b455a6527bf 100644 --- a/llvm/include/llvm/Analysis/OptimizationDiagnosticInfo.h +++ b/llvm/include/llvm/Analysis/OptimizationDiagnosticInfo.h @@ -16,6 +16,7 @@ #define LLVM_IR_OPTIMIZATIONDIAGNOSTICINFO_H #include "llvm/ADT/Optional.h" +#include "llvm/IR/PassManager.h" #include "llvm/Pass.h" namespace llvm { @@ -28,9 +29,19 @@ class Pass; class Twine; class Value; -class OptimizationRemarkEmitter : public FunctionPass { +class OptimizationRemarkEmitter { public: - OptimizationRemarkEmitter(); + OptimizationRemarkEmitter(Function *F, BlockFrequencyInfo *BFI) + : F(F), BFI(BFI) {} + + OptimizationRemarkEmitter(OptimizationRemarkEmitter &&Arg) + : F(Arg.F), BFI(Arg.BFI) {} + + OptimizationRemarkEmitter &operator=(OptimizationRemarkEmitter &&RHS) { + F = RHS.F; + BFI = RHS.BFI; + return *this; + } /// Emit an optimization-missed message. /// @@ -48,19 +59,46 @@ public: void emitOptimizationRemarkMissed(const char *PassName, Loop *L, const Twine &Msg); +private: + Function *F; + + BlockFrequencyInfo *BFI; + + Optional<uint64_t> computeHotness(Value *V); + + OptimizationRemarkEmitter(const OptimizationRemarkEmitter &) = delete; + void operator=(const OptimizationRemarkEmitter &) = delete; +}; + +class OptimizationRemarkEmitterWrapperPass : public FunctionPass { + std::unique_ptr<OptimizationRemarkEmitter> ORE; + +public: + OptimizationRemarkEmitterWrapperPass(); + bool runOnFunction(Function &F) override; void getAnalysisUsage(AnalysisUsage &AU) const override; + OptimizationRemarkEmitter &getORE() { + assert(ORE && "pass not run yet"); + return *ORE; + } + static char ID; +}; -private: - Function *F; +class OptimizationRemarkEmitterAnalysis + : public AnalysisInfoMixin<OptimizationRemarkEmitterAnalysis> { + friend AnalysisInfoMixin<OptimizationRemarkEmitterAnalysis>; + static char PassID; - BlockFrequencyInfo *BFI; +public: + /// \brief Provide the result typedef for this analysis pass. + typedef OptimizationRemarkEmitter Result; - Optional<uint64_t> computeHotness(Value *V); + /// \brief Run the analysis pass over a function and produce BFI. + Result run(Function &F, AnalysisManager<Function> &AM); }; } - #endif // LLVM_IR_OPTIMIZATIONDIAGNOSTICINFO_H diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index f8ec8586d73..86ea80eeba1 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -243,7 +243,7 @@ void initializeObjCARCAPElimPass(PassRegistry&); void initializeObjCARCContractPass(PassRegistry&); void initializeObjCARCExpandPass(PassRegistry&); void initializeObjCARCOptPass(PassRegistry&); -void initializeOptimizationRemarkEmitterPass(PassRegistry&); +void initializeOptimizationRemarkEmitterWrapperPassPass(PassRegistry&); void initializeOptimizePHIsPass(PassRegistry&); void initializePAEvalPass(PassRegistry &); void initializePEIPass(PassRegistry&); |