forked from OSchip/llvm-project
[OptRemarkEmitter] Port to new PM
Summary: The main goal is to able to start using the new OptRemarkEmitter analysis from the LoopVectorizer. Since the vectorizer was recently converted to the new PM, it makes sense to convert this analysis as well. This pass is currently tested through the LoopDistribution pass, so I am also porting LoopDistribution to get coverage for this analysis with the new PM. Reviewers: davidxl, silvas Subscribers: llvm-commits, mzolotukhin Differential Revision: https://reviews.llvm.org/D22436 llvm-svn: 275810
This commit is contained in:
parent
3beef41873
commit
79ac42a5c9
|
@ -16,6 +16,7 @@
|
||||||
#define LLVM_IR_OPTIMIZATIONDIAGNOSTICINFO_H
|
#define LLVM_IR_OPTIMIZATIONDIAGNOSTICINFO_H
|
||||||
|
|
||||||
#include "llvm/ADT/Optional.h"
|
#include "llvm/ADT/Optional.h"
|
||||||
|
#include "llvm/IR/PassManager.h"
|
||||||
#include "llvm/Pass.h"
|
#include "llvm/Pass.h"
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
@ -28,9 +29,19 @@ class Pass;
|
||||||
class Twine;
|
class Twine;
|
||||||
class Value;
|
class Value;
|
||||||
|
|
||||||
class OptimizationRemarkEmitter : public FunctionPass {
|
class OptimizationRemarkEmitter {
|
||||||
public:
|
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.
|
/// Emit an optimization-missed message.
|
||||||
///
|
///
|
||||||
|
@ -48,19 +59,46 @@ public:
|
||||||
void emitOptimizationRemarkMissed(const char *PassName, Loop *L,
|
void emitOptimizationRemarkMissed(const char *PassName, Loop *L,
|
||||||
const Twine &Msg);
|
const Twine &Msg);
|
||||||
|
|
||||||
bool runOnFunction(Function &F) override;
|
|
||||||
|
|
||||||
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
|
||||||
|
|
||||||
static char ID;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Function *F;
|
Function *F;
|
||||||
|
|
||||||
BlockFrequencyInfo *BFI;
|
BlockFrequencyInfo *BFI;
|
||||||
|
|
||||||
Optional<uint64_t> computeHotness(Value *V);
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
class OptimizationRemarkEmitterAnalysis
|
||||||
|
: public AnalysisInfoMixin<OptimizationRemarkEmitterAnalysis> {
|
||||||
|
friend AnalysisInfoMixin<OptimizationRemarkEmitterAnalysis>;
|
||||||
|
static char PassID;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// \brief Provide the result typedef for this analysis pass.
|
||||||
|
typedef OptimizationRemarkEmitter Result;
|
||||||
|
|
||||||
|
/// \brief Run the analysis pass over a function and produce BFI.
|
||||||
|
Result run(Function &F, AnalysisManager<Function> &AM);
|
||||||
|
};
|
||||||
|
}
|
||||||
#endif // LLVM_IR_OPTIMIZATIONDIAGNOSTICINFO_H
|
#endif // LLVM_IR_OPTIMIZATIONDIAGNOSTICINFO_H
|
||||||
|
|
|
@ -243,7 +243,7 @@ void initializeObjCARCAPElimPass(PassRegistry&);
|
||||||
void initializeObjCARCContractPass(PassRegistry&);
|
void initializeObjCARCContractPass(PassRegistry&);
|
||||||
void initializeObjCARCExpandPass(PassRegistry&);
|
void initializeObjCARCExpandPass(PassRegistry&);
|
||||||
void initializeObjCARCOptPass(PassRegistry&);
|
void initializeObjCARCOptPass(PassRegistry&);
|
||||||
void initializeOptimizationRemarkEmitterPass(PassRegistry&);
|
void initializeOptimizationRemarkEmitterWrapperPassPass(PassRegistry&);
|
||||||
void initializeOptimizePHIsPass(PassRegistry&);
|
void initializeOptimizePHIsPass(PassRegistry&);
|
||||||
void initializePAEvalPass(PassRegistry &);
|
void initializePAEvalPass(PassRegistry &);
|
||||||
void initializePEIPass(PassRegistry&);
|
void initializePEIPass(PassRegistry&);
|
||||||
|
|
|
@ -64,7 +64,7 @@ void llvm::initializeAnalysis(PassRegistry &Registry) {
|
||||||
initializeModuleDebugInfoPrinterPass(Registry);
|
initializeModuleDebugInfoPrinterPass(Registry);
|
||||||
initializeModuleSummaryIndexWrapperPassPass(Registry);
|
initializeModuleSummaryIndexWrapperPassPass(Registry);
|
||||||
initializeObjCARCAAWrapperPassPass(Registry);
|
initializeObjCARCAAWrapperPassPass(Registry);
|
||||||
initializeOptimizationRemarkEmitterPass(Registry);
|
initializeOptimizationRemarkEmitterWrapperPassPass(Registry);
|
||||||
initializePostDominatorTreeWrapperPassPass(Registry);
|
initializePostDominatorTreeWrapperPassPass(Registry);
|
||||||
initializeRegionInfoPassPass(Registry);
|
initializeRegionInfoPassPass(Registry);
|
||||||
initializeRegionViewerPass(Registry);
|
initializeRegionViewerPass(Registry);
|
||||||
|
|
|
@ -20,10 +20,6 @@
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
OptimizationRemarkEmitter::OptimizationRemarkEmitter() : FunctionPass(ID) {
|
|
||||||
initializeOptimizationRemarkEmitterPass(*PassRegistry::getPassRegistry());
|
|
||||||
}
|
|
||||||
|
|
||||||
Optional<uint64_t> OptimizationRemarkEmitter::computeHotness(Value *V) {
|
Optional<uint64_t> OptimizationRemarkEmitter::computeHotness(Value *V) {
|
||||||
if (!BFI)
|
if (!BFI)
|
||||||
return None;
|
return None;
|
||||||
|
@ -43,27 +39,50 @@ void OptimizationRemarkEmitter::emitOptimizationRemarkMissed(
|
||||||
emitOptimizationRemarkMissed(PassName, L->getStartLoc(), L->getHeader(), Msg);
|
emitOptimizationRemarkMissed(PassName, L->getStartLoc(), L->getHeader(), Msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OptimizationRemarkEmitter::runOnFunction(Function &Fn) {
|
OptimizationRemarkEmitterWrapperPass::OptimizationRemarkEmitterWrapperPass()
|
||||||
F = &Fn;
|
: FunctionPass(ID) {
|
||||||
|
initializeOptimizationRemarkEmitterWrapperPassPass(
|
||||||
|
*PassRegistry::getPassRegistry());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OptimizationRemarkEmitterWrapperPass::runOnFunction(Function &Fn) {
|
||||||
|
BlockFrequencyInfo *BFI;
|
||||||
|
|
||||||
if (Fn.getContext().getDiagnosticHotnessRequested())
|
if (Fn.getContext().getDiagnosticHotnessRequested())
|
||||||
BFI = &getAnalysis<LazyBlockFrequencyInfoPass>().getBFI();
|
BFI = &getAnalysis<LazyBlockFrequencyInfoPass>().getBFI();
|
||||||
else
|
else
|
||||||
BFI = nullptr;
|
BFI = nullptr;
|
||||||
|
|
||||||
|
ORE = llvm::make_unique<OptimizationRemarkEmitter>(&Fn, BFI);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptimizationRemarkEmitter::getAnalysisUsage(AnalysisUsage &AU) const {
|
void OptimizationRemarkEmitterWrapperPass::getAnalysisUsage(
|
||||||
|
AnalysisUsage &AU) const {
|
||||||
LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AU);
|
LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AU);
|
||||||
AU.setPreservesAll();
|
AU.setPreservesAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
char OptimizationRemarkEmitter::ID = 0;
|
char OptimizationRemarkEmitterAnalysis::PassID;
|
||||||
|
|
||||||
|
OptimizationRemarkEmitter
|
||||||
|
OptimizationRemarkEmitterAnalysis::run(Function &F, AnalysisManager<Function> &AM) {
|
||||||
|
BlockFrequencyInfo *BFI;
|
||||||
|
|
||||||
|
if (F.getContext().getDiagnosticHotnessRequested())
|
||||||
|
BFI = &AM.getResult<BlockFrequencyAnalysis>(F);
|
||||||
|
else
|
||||||
|
BFI = nullptr;
|
||||||
|
|
||||||
|
return OptimizationRemarkEmitter(&F, BFI);
|
||||||
|
}
|
||||||
|
|
||||||
|
char OptimizationRemarkEmitterWrapperPass::ID = 0;
|
||||||
static const char ore_name[] = "Optimization Remark Emitter";
|
static const char ore_name[] = "Optimization Remark Emitter";
|
||||||
#define ORE_NAME "opt-remark-emitter"
|
#define ORE_NAME "opt-remark-emitter"
|
||||||
|
|
||||||
INITIALIZE_PASS_BEGIN(OptimizationRemarkEmitter, ORE_NAME, ore_name, false,
|
INITIALIZE_PASS_BEGIN(OptimizationRemarkEmitterWrapperPass, ORE_NAME, ore_name,
|
||||||
true)
|
false, true)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LazyBFIPass)
|
INITIALIZE_PASS_DEPENDENCY(LazyBFIPass)
|
||||||
INITIALIZE_PASS_END(OptimizationRemarkEmitter, ORE_NAME, ore_name, false, true)
|
INITIALIZE_PASS_END(OptimizationRemarkEmitterWrapperPass, ORE_NAME, ore_name,
|
||||||
|
false, true)
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "llvm/Analysis/LoopAccessAnalysis.h"
|
#include "llvm/Analysis/LoopAccessAnalysis.h"
|
||||||
#include "llvm/Analysis/LoopInfo.h"
|
#include "llvm/Analysis/LoopInfo.h"
|
||||||
#include "llvm/Analysis/MemoryDependenceAnalysis.h"
|
#include "llvm/Analysis/MemoryDependenceAnalysis.h"
|
||||||
|
#include "llvm/Analysis/OptimizationDiagnosticInfo.h"
|
||||||
#include "llvm/Analysis/PostDominators.h"
|
#include "llvm/Analysis/PostDominators.h"
|
||||||
#include "llvm/Analysis/ProfileSummaryInfo.h"
|
#include "llvm/Analysis/ProfileSummaryInfo.h"
|
||||||
#include "llvm/Analysis/RegionInfo.h"
|
#include "llvm/Analysis/RegionInfo.h"
|
||||||
|
|
|
@ -101,6 +101,7 @@ FUNCTION_ANALYSIS("memdep", MemoryDependenceAnalysis())
|
||||||
FUNCTION_ANALYSIS("memoryssa", MemorySSAAnalysis())
|
FUNCTION_ANALYSIS("memoryssa", MemorySSAAnalysis())
|
||||||
FUNCTION_ANALYSIS("regions", RegionInfoAnalysis())
|
FUNCTION_ANALYSIS("regions", RegionInfoAnalysis())
|
||||||
FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis())
|
FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis())
|
||||||
|
FUNCTION_ANALYSIS("opt-remark-emit", OptimizationRemarkEmitterAnalysis())
|
||||||
FUNCTION_ANALYSIS("scalar-evolution", ScalarEvolutionAnalysis())
|
FUNCTION_ANALYSIS("scalar-evolution", ScalarEvolutionAnalysis())
|
||||||
FUNCTION_ANALYSIS("targetlibinfo", TargetLibraryAnalysis())
|
FUNCTION_ANALYSIS("targetlibinfo", TargetLibraryAnalysis())
|
||||||
FUNCTION_ANALYSIS("targetir",
|
FUNCTION_ANALYSIS("targetir",
|
||||||
|
|
|
@ -883,7 +883,7 @@ public:
|
||||||
auto *LAA = &getAnalysis<LoopAccessLegacyAnalysis>();
|
auto *LAA = &getAnalysis<LoopAccessLegacyAnalysis>();
|
||||||
auto *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
auto *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
|
auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
|
||||||
auto *ORE = &getAnalysis<OptimizationRemarkEmitter>();
|
auto *ORE = &getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE();
|
||||||
|
|
||||||
// Build up a worklist of inner-loops to vectorize. This is necessary as the
|
// Build up a worklist of inner-loops to vectorize. This is necessary as the
|
||||||
// act of distributing a loop creates new loops and can invalidate iterators
|
// act of distributing a loop creates new loops and can invalidate iterators
|
||||||
|
@ -918,7 +918,7 @@ public:
|
||||||
AU.addRequired<LoopAccessLegacyAnalysis>();
|
AU.addRequired<LoopAccessLegacyAnalysis>();
|
||||||
AU.addRequired<DominatorTreeWrapperPass>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<DominatorTreeWrapperPass>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<OptimizationRemarkEmitter>();
|
AU.addRequired<OptimizationRemarkEmitterWrapperPass>();
|
||||||
}
|
}
|
||||||
|
|
||||||
static char ID;
|
static char ID;
|
||||||
|
@ -938,7 +938,7 @@ INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopAccessLegacyAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(LoopAccessLegacyAnalysis)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)
|
INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(OptimizationRemarkEmitter)
|
INITIALIZE_PASS_DEPENDENCY(OptimizationRemarkEmitterWrapperPass)
|
||||||
INITIALIZE_PASS_END(LoopDistribute, LDIST_NAME, ldist_name, false, false)
|
INITIALIZE_PASS_END(LoopDistribute, LDIST_NAME, ldist_name, false, false)
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
Loading…
Reference in New Issue