Skip to content

Commit 79ac42a

Browse files
committedJul 18, 2016
[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
1 parent 3beef41 commit 79ac42a

File tree

7 files changed

+82
-23
lines changed

7 files changed

+82
-23
lines changed
 

Diff for: ‎llvm/include/llvm/Analysis/OptimizationDiagnosticInfo.h

+45-7
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#define LLVM_IR_OPTIMIZATIONDIAGNOSTICINFO_H
1717

1818
#include "llvm/ADT/Optional.h"
19+
#include "llvm/IR/PassManager.h"
1920
#include "llvm/Pass.h"
2021

2122
namespace llvm {
@@ -28,9 +29,19 @@ class Pass;
2829
class Twine;
2930
class Value;
3031

31-
class OptimizationRemarkEmitter : public FunctionPass {
32+
class OptimizationRemarkEmitter {
3233
public:
33-
OptimizationRemarkEmitter();
34+
OptimizationRemarkEmitter(Function *F, BlockFrequencyInfo *BFI)
35+
: F(F), BFI(BFI) {}
36+
37+
OptimizationRemarkEmitter(OptimizationRemarkEmitter &&Arg)
38+
: F(Arg.F), BFI(Arg.BFI) {}
39+
40+
OptimizationRemarkEmitter &operator=(OptimizationRemarkEmitter &&RHS) {
41+
F = RHS.F;
42+
BFI = RHS.BFI;
43+
return *this;
44+
}
3445

3546
/// Emit an optimization-missed message.
3647
///
@@ -48,19 +59,46 @@ class OptimizationRemarkEmitter : public FunctionPass {
4859
void emitOptimizationRemarkMissed(const char *PassName, Loop *L,
4960
const Twine &Msg);
5061

62+
private:
63+
Function *F;
64+
65+
BlockFrequencyInfo *BFI;
66+
67+
Optional<uint64_t> computeHotness(Value *V);
68+
69+
OptimizationRemarkEmitter(const OptimizationRemarkEmitter &) = delete;
70+
void operator=(const OptimizationRemarkEmitter &) = delete;
71+
};
72+
73+
class OptimizationRemarkEmitterWrapperPass : public FunctionPass {
74+
std::unique_ptr<OptimizationRemarkEmitter> ORE;
75+
76+
public:
77+
OptimizationRemarkEmitterWrapperPass();
78+
5179
bool runOnFunction(Function &F) override;
5280

5381
void getAnalysisUsage(AnalysisUsage &AU) const override;
5482

83+
OptimizationRemarkEmitter &getORE() {
84+
assert(ORE && "pass not run yet");
85+
return *ORE;
86+
}
87+
5588
static char ID;
89+
};
5690

57-
private:
58-
Function *F;
91+
class OptimizationRemarkEmitterAnalysis
92+
: public AnalysisInfoMixin<OptimizationRemarkEmitterAnalysis> {
93+
friend AnalysisInfoMixin<OptimizationRemarkEmitterAnalysis>;
94+
static char PassID;
5995

60-
BlockFrequencyInfo *BFI;
96+
public:
97+
/// \brief Provide the result typedef for this analysis pass.
98+
typedef OptimizationRemarkEmitter Result;
6199

62-
Optional<uint64_t> computeHotness(Value *V);
100+
/// \brief Run the analysis pass over a function and produce BFI.
101+
Result run(Function &F, AnalysisManager<Function> &AM);
63102
};
64103
}
65-
66104
#endif // LLVM_IR_OPTIMIZATIONDIAGNOSTICINFO_H

Diff for: ‎llvm/include/llvm/InitializePasses.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ void initializeObjCARCAPElimPass(PassRegistry&);
243243
void initializeObjCARCContractPass(PassRegistry&);
244244
void initializeObjCARCExpandPass(PassRegistry&);
245245
void initializeObjCARCOptPass(PassRegistry&);
246-
void initializeOptimizationRemarkEmitterPass(PassRegistry&);
246+
void initializeOptimizationRemarkEmitterWrapperPassPass(PassRegistry&);
247247
void initializeOptimizePHIsPass(PassRegistry&);
248248
void initializePAEvalPass(PassRegistry &);
249249
void initializePEIPass(PassRegistry&);

Diff for: ‎llvm/lib/Analysis/Analysis.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ void llvm::initializeAnalysis(PassRegistry &Registry) {
6464
initializeModuleDebugInfoPrinterPass(Registry);
6565
initializeModuleSummaryIndexWrapperPassPass(Registry);
6666
initializeObjCARCAAWrapperPassPass(Registry);
67-
initializeOptimizationRemarkEmitterPass(Registry);
67+
initializeOptimizationRemarkEmitterWrapperPassPass(Registry);
6868
initializePostDominatorTreeWrapperPassPass(Registry);
6969
initializeRegionInfoPassPass(Registry);
7070
initializeRegionViewerPass(Registry);

Diff for: ‎llvm/lib/Analysis/OptimizationDiagnosticInfo.cpp

+30-11
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,6 @@
2020

2121
using namespace llvm;
2222

23-
OptimizationRemarkEmitter::OptimizationRemarkEmitter() : FunctionPass(ID) {
24-
initializeOptimizationRemarkEmitterPass(*PassRegistry::getPassRegistry());
25-
}
26-
2723
Optional<uint64_t> OptimizationRemarkEmitter::computeHotness(Value *V) {
2824
if (!BFI)
2925
return None;
@@ -43,27 +39,50 @@ void OptimizationRemarkEmitter::emitOptimizationRemarkMissed(
4339
emitOptimizationRemarkMissed(PassName, L->getStartLoc(), L->getHeader(), Msg);
4440
}
4541

46-
bool OptimizationRemarkEmitter::runOnFunction(Function &Fn) {
47-
F = &Fn;
42+
OptimizationRemarkEmitterWrapperPass::OptimizationRemarkEmitterWrapperPass()
43+
: FunctionPass(ID) {
44+
initializeOptimizationRemarkEmitterWrapperPassPass(
45+
*PassRegistry::getPassRegistry());
46+
}
47+
48+
bool OptimizationRemarkEmitterWrapperPass::runOnFunction(Function &Fn) {
49+
BlockFrequencyInfo *BFI;
4850

4951
if (Fn.getContext().getDiagnosticHotnessRequested())
5052
BFI = &getAnalysis<LazyBlockFrequencyInfoPass>().getBFI();
5153
else
5254
BFI = nullptr;
5355

56+
ORE = llvm::make_unique<OptimizationRemarkEmitter>(&Fn, BFI);
5457
return false;
5558
}
5659

57-
void OptimizationRemarkEmitter::getAnalysisUsage(AnalysisUsage &AU) const {
60+
void OptimizationRemarkEmitterWrapperPass::getAnalysisUsage(
61+
AnalysisUsage &AU) const {
5862
LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AU);
5963
AU.setPreservesAll();
6064
}
6165

62-
char OptimizationRemarkEmitter::ID = 0;
66+
char OptimizationRemarkEmitterAnalysis::PassID;
67+
68+
OptimizationRemarkEmitter
69+
OptimizationRemarkEmitterAnalysis::run(Function &F, AnalysisManager<Function> &AM) {
70+
BlockFrequencyInfo *BFI;
71+
72+
if (F.getContext().getDiagnosticHotnessRequested())
73+
BFI = &AM.getResult<BlockFrequencyAnalysis>(F);
74+
else
75+
BFI = nullptr;
76+
77+
return OptimizationRemarkEmitter(&F, BFI);
78+
}
79+
80+
char OptimizationRemarkEmitterWrapperPass::ID = 0;
6381
static const char ore_name[] = "Optimization Remark Emitter";
6482
#define ORE_NAME "opt-remark-emitter"
6583

66-
INITIALIZE_PASS_BEGIN(OptimizationRemarkEmitter, ORE_NAME, ore_name, false,
67-
true)
84+
INITIALIZE_PASS_BEGIN(OptimizationRemarkEmitterWrapperPass, ORE_NAME, ore_name,
85+
false, true)
6886
INITIALIZE_PASS_DEPENDENCY(LazyBFIPass)
69-
INITIALIZE_PASS_END(OptimizationRemarkEmitter, ORE_NAME, ore_name, false, true)
87+
INITIALIZE_PASS_END(OptimizationRemarkEmitterWrapperPass, ORE_NAME, ore_name,
88+
false, true)

Diff for: ‎llvm/lib/Passes/PassBuilder.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "llvm/Analysis/LoopAccessAnalysis.h"
3939
#include "llvm/Analysis/LoopInfo.h"
4040
#include "llvm/Analysis/MemoryDependenceAnalysis.h"
41+
#include "llvm/Analysis/OptimizationDiagnosticInfo.h"
4142
#include "llvm/Analysis/PostDominators.h"
4243
#include "llvm/Analysis/ProfileSummaryInfo.h"
4344
#include "llvm/Analysis/RegionInfo.h"

Diff for: ‎llvm/lib/Passes/PassRegistry.def

+1
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ FUNCTION_ANALYSIS("memdep", MemoryDependenceAnalysis())
101101
FUNCTION_ANALYSIS("memoryssa", MemorySSAAnalysis())
102102
FUNCTION_ANALYSIS("regions", RegionInfoAnalysis())
103103
FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis())
104+
FUNCTION_ANALYSIS("opt-remark-emit", OptimizationRemarkEmitterAnalysis())
104105
FUNCTION_ANALYSIS("scalar-evolution", ScalarEvolutionAnalysis())
105106
FUNCTION_ANALYSIS("targetlibinfo", TargetLibraryAnalysis())
106107
FUNCTION_ANALYSIS("targetir",

Diff for: ‎llvm/lib/Transforms/Scalar/LoopDistribute.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -883,7 +883,7 @@ class LoopDistribute : public FunctionPass {
883883
auto *LAA = &getAnalysis<LoopAccessLegacyAnalysis>();
884884
auto *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
885885
auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
886-
auto *ORE = &getAnalysis<OptimizationRemarkEmitter>();
886+
auto *ORE = &getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE();
887887

888888
// Build up a worklist of inner-loops to vectorize. This is necessary as the
889889
// act of distributing a loop creates new loops and can invalidate iterators
@@ -918,7 +918,7 @@ class LoopDistribute : public FunctionPass {
918918
AU.addRequired<LoopAccessLegacyAnalysis>();
919919
AU.addRequired<DominatorTreeWrapperPass>();
920920
AU.addPreserved<DominatorTreeWrapperPass>();
921-
AU.addRequired<OptimizationRemarkEmitter>();
921+
AU.addRequired<OptimizationRemarkEmitterWrapperPass>();
922922
}
923923

924924
static char ID;
@@ -938,7 +938,7 @@ INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
938938
INITIALIZE_PASS_DEPENDENCY(LoopAccessLegacyAnalysis)
939939
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
940940
INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)
941-
INITIALIZE_PASS_DEPENDENCY(OptimizationRemarkEmitter)
941+
INITIALIZE_PASS_DEPENDENCY(OptimizationRemarkEmitterWrapperPass)
942942
INITIALIZE_PASS_END(LoopDistribute, LDIST_NAME, ldist_name, false, false)
943943

944944
namespace llvm {

0 commit comments

Comments
 (0)
Please sign in to comment.