forked from OSchip/llvm-project
[PM] Port Branch Probability Analysis pass to the new pass manager.
Differential Revision: http://reviews.llvm.org/D19839 llvm-svn: 268601
This commit is contained in:
parent
c1e50d5090
commit
6e5dd41481
|
@ -17,6 +17,7 @@
|
|||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/IR/CFG.h"
|
||||
#include "llvm/IR/PassManager.h"
|
||||
#include "llvm/InitializePasses.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/BranchProbability.h"
|
||||
|
@ -44,6 +45,19 @@ public:
|
|||
calculate(F, LI);
|
||||
}
|
||||
|
||||
BranchProbabilityInfo(BranchProbabilityInfo &&Arg)
|
||||
: Probs(std::move(Arg.Probs)), LastF(Arg.LastF),
|
||||
PostDominatedByUnreachable(std::move(Arg.PostDominatedByUnreachable)),
|
||||
PostDominatedByColdCall(std::move(Arg.PostDominatedByColdCall)) {}
|
||||
|
||||
BranchProbabilityInfo &operator=(BranchProbabilityInfo &&RHS) {
|
||||
releaseMemory();
|
||||
Probs = std::move(RHS.Probs);
|
||||
PostDominatedByColdCall = std::move(RHS.PostDominatedByColdCall);
|
||||
PostDominatedByUnreachable = std::move(RHS.PostDominatedByUnreachable);
|
||||
return *this;
|
||||
}
|
||||
|
||||
void releaseMemory();
|
||||
|
||||
void print(raw_ostream &OS) const;
|
||||
|
@ -103,6 +117,9 @@ public:
|
|||
void calculate(const Function &F, const LoopInfo &LI);
|
||||
|
||||
private:
|
||||
void operator=(const BranchProbabilityInfo &) = delete;
|
||||
BranchProbabilityInfo(const BranchProbabilityInfo &) = delete;
|
||||
|
||||
// Since we allow duplicate edges from one basic block to another, we use
|
||||
// a pair (PredBlock and an index in the successors) to specify an edge.
|
||||
typedef std::pair<const BasicBlock *, unsigned> Edge;
|
||||
|
@ -136,6 +153,30 @@ private:
|
|||
bool calcInvokeHeuristics(const BasicBlock *BB);
|
||||
};
|
||||
|
||||
/// \brief Analysis pass which computes \c BranchProbabilityInfo.
|
||||
class BranchProbabilityAnalysis
|
||||
: public AnalysisInfoMixin<BranchProbabilityAnalysis> {
|
||||
friend AnalysisInfoMixin<BranchProbabilityAnalysis>;
|
||||
static char PassID;
|
||||
|
||||
public:
|
||||
/// \brief Provide the result typedef for this analysis pass.
|
||||
typedef BranchProbabilityInfo Result;
|
||||
|
||||
/// \brief Run the analysis pass over a function and produce BPI.
|
||||
BranchProbabilityInfo run(Function &F, AnalysisManager<Function> &AM);
|
||||
};
|
||||
|
||||
/// \brief Printer pass for the \c BranchProbabilityAnalysis results.
|
||||
class BranchProbabilityPrinterPass
|
||||
: public PassInfoMixin<BranchProbabilityPrinterPass> {
|
||||
raw_ostream &OS;
|
||||
|
||||
public:
|
||||
explicit BranchProbabilityPrinterPass(raw_ostream &OS) : OS(OS) {}
|
||||
PreservedAnalyses run(Function &F, AnalysisManager<Function> &AM);
|
||||
};
|
||||
|
||||
/// \brief Legacy analysis pass which computes \c BranchProbabilityInfo.
|
||||
class BranchProbabilityInfoWrapperPass : public FunctionPass {
|
||||
BranchProbabilityInfo BPI;
|
||||
|
|
|
@ -689,3 +689,20 @@ void BranchProbabilityInfoWrapperPass::print(raw_ostream &OS,
|
|||
const Module *) const {
|
||||
BPI.print(OS);
|
||||
}
|
||||
|
||||
char BranchProbabilityAnalysis::PassID;
|
||||
BranchProbabilityInfo
|
||||
BranchProbabilityAnalysis::run(Function &F, AnalysisManager<Function> &AM) {
|
||||
BranchProbabilityInfo BPI;
|
||||
BPI.calculate(F, AM.getResult<LoopAnalysis>(F));
|
||||
return BPI;
|
||||
}
|
||||
|
||||
PreservedAnalyses
|
||||
BranchProbabilityPrinterPass::run(Function &F, AnalysisManager<Function> &AM) {
|
||||
OS << "Printing analysis results of BPI for function "
|
||||
<< "'" << F.getName() << "':"
|
||||
<< "\n";
|
||||
AM.getResult<BranchProbabilityAnalysis>(F).print(OS);
|
||||
return PreservedAnalyses::all();
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "llvm/Analysis/AliasAnalysisEvaluator.h"
|
||||
#include "llvm/Analysis/AssumptionCache.h"
|
||||
#include "llvm/Analysis/BasicAliasAnalysis.h"
|
||||
#include "llvm/Analysis/BranchProbabilityInfo.h"
|
||||
#include "llvm/Analysis/CFLAliasAnalysis.h"
|
||||
#include "llvm/Analysis/CGSCCPassManager.h"
|
||||
#include "llvm/Analysis/CallGraph.h"
|
||||
|
|
|
@ -71,6 +71,7 @@ CGSCC_PASS("no-op-cgscc", NoOpCGSCCPass())
|
|||
#endif
|
||||
FUNCTION_ANALYSIS("aa", AAManager())
|
||||
FUNCTION_ANALYSIS("assumptions", AssumptionAnalysis())
|
||||
FUNCTION_ANALYSIS("branch-prob", BranchProbabilityAnalysis())
|
||||
FUNCTION_ANALYSIS("domtree", DominatorTreeAnalysis())
|
||||
FUNCTION_ANALYSIS("postdomtree", PostDominatorTreeAnalysis())
|
||||
FUNCTION_ANALYSIS("demanded-bits", DemandedBitsAnalysis())
|
||||
|
@ -110,6 +111,7 @@ FUNCTION_PASS("lower-expect", LowerExpectIntrinsicPass())
|
|||
FUNCTION_PASS("gvn", GVN())
|
||||
FUNCTION_PASS("print", PrintFunctionPass(dbgs()))
|
||||
FUNCTION_PASS("print<assumptions>", AssumptionPrinterPass(dbgs()))
|
||||
FUNCTION_PASS("print<branch-prob>", BranchProbabilityPrinterPass(dbgs()))
|
||||
FUNCTION_PASS("print<domtree>", DominatorTreePrinterPass(dbgs()))
|
||||
FUNCTION_PASS("print<postdomtree>", PostDominatorTreePrinterPass(dbgs()))
|
||||
FUNCTION_PASS("print<demanded-bits>", DemandedBitsPrinterPass(dbgs()))
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
; RUN: opt < %s -analyze -branch-prob | FileCheck %s
|
||||
; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
|
||||
|
||||
define i32 @test1(i32 %i, i32* %a) {
|
||||
; CHECK: Printing analysis {{.*}} for function 'test1'
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
; RUN: opt -analyze -branch-prob < %s | FileCheck %s
|
||||
; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
|
||||
|
||||
declare i32 @llvm.experimental.deoptimize.i32(...)
|
||||
|
||||
define i32 @test1(i32 %a, i32 %b) {
|
||||
; CHECK-LABEL: Printing analysis 'Branch Probability Analysis' for function 'test1':
|
||||
; CHECK-LABEL: Printing analysis {{.*}} for function 'test1':
|
||||
entry:
|
||||
%cond = icmp eq i32 %a, 42
|
||||
br i1 %cond, label %exit, label %deopt
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
; Test the static branch probability heuristics for no-return functions.
|
||||
; RUN: opt < %s -analyze -branch-prob | FileCheck %s
|
||||
; RUN: opt < %s -passes='print<branch-prob>' --disable-output 2>&1 | FileCheck %s
|
||||
|
||||
declare void @g1()
|
||||
declare void @g2()
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
; Test the static branch probability heuristics for no-return functions.
|
||||
; RUN: opt < %s -analyze -branch-prob | FileCheck %s
|
||||
; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
|
||||
|
||||
declare void @abort() noreturn
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
; RUN: opt < %s -analyze -branch-prob | FileCheck %s
|
||||
; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
|
||||
|
||||
; Since neither of while.body's out-edges is an exit or a back edge,
|
||||
; calcLoopBranchHeuristics should return early without setting the weights.
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
; RUN: opt < %s -analyze -branch-prob | FileCheck %s
|
||||
; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
|
||||
|
||||
; In this test, the else clause is taken about 90% of the time. This was not
|
||||
; reflected in the probability computation because the weight is larger than
|
||||
|
|
Loading…
Reference in New Issue