mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-25 04:39:51 +00:00
Use MachineBranchProbabilityInfo in If-Conversion instead of its own heuristics.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136826 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2626dba9c5
commit
990f78d53b
@ -16,14 +16,13 @@
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
#include "llvm/Codegen/MachineBranchProbabilityInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||
#include "llvm/CodeGen/MachineLoopInfo.h"
|
||||
#include "llvm/MC/MCInstrItineraries.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Target/TargetLowering.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Support/BranchProbability.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
@ -154,7 +153,8 @@ namespace {
|
||||
const TargetInstrInfo *TII;
|
||||
const TargetRegisterInfo *TRI;
|
||||
const InstrItineraryData *InstrItins;
|
||||
const MachineLoopInfo *MLI;
|
||||
const MachineBranchProbabilityInfo *MBPI;
|
||||
|
||||
bool MadeChange;
|
||||
int FnNum;
|
||||
public:
|
||||
@ -164,7 +164,7 @@ namespace {
|
||||
}
|
||||
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addRequired<MachineLoopInfo>();
|
||||
AU.addRequired<MachineBranchProbabilityInfo>();
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
|
||||
@ -252,7 +252,7 @@ namespace {
|
||||
}
|
||||
|
||||
INITIALIZE_PASS_BEGIN(IfConverter, "if-converter", "If Converter", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
|
||||
INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
|
||||
INITIALIZE_PASS_END(IfConverter, "if-converter", "If Converter", false, false)
|
||||
|
||||
FunctionPass *llvm::createIfConverterPass() { return new IfConverter(); }
|
||||
@ -261,7 +261,7 @@ bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
|
||||
TLI = MF.getTarget().getTargetLowering();
|
||||
TII = MF.getTarget().getInstrInfo();
|
||||
TRI = MF.getTarget().getRegisterInfo();
|
||||
MLI = &getAnalysis<MachineLoopInfo>();
|
||||
MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
|
||||
InstrItins = MF.getTarget().getInstrItineraryData();
|
||||
if (!TII) return false;
|
||||
|
||||
@ -791,26 +791,7 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
|
||||
bool FNeedSub = FalseBBI.Predicate.size() > 0;
|
||||
bool Enqueued = false;
|
||||
|
||||
// Try to predict the branch, using loop info to guide us.
|
||||
// General heuristics are:
|
||||
// - backedge -> 90% taken
|
||||
// - early exit -> 20% taken
|
||||
// - branch predictor confidence -> 90%
|
||||
BranchProbability Prediction(5, 10);
|
||||
MachineLoop *Loop = MLI->getLoopFor(BB);
|
||||
if (Loop) {
|
||||
if (TrueBBI.BB == Loop->getHeader())
|
||||
Prediction = BranchProbability(9, 10);
|
||||
else if (FalseBBI.BB == Loop->getHeader())
|
||||
Prediction = BranchProbability(1, 10);
|
||||
|
||||
MachineLoop *TrueLoop = MLI->getLoopFor(TrueBBI.BB);
|
||||
MachineLoop *FalseLoop = MLI->getLoopFor(FalseBBI.BB);
|
||||
if (!TrueLoop || TrueLoop->getParentLoop() == Loop)
|
||||
Prediction = BranchProbability(2, 10);
|
||||
else if (!FalseLoop || FalseLoop->getParentLoop() == Loop)
|
||||
Prediction = BranchProbability(8, 10);
|
||||
}
|
||||
BranchProbability Prediction = MBPI->getEdgeProbability(BB, TrueBBI.BB);
|
||||
|
||||
if (CanRevCond && ValidDiamond(TrueBBI, FalseBBI, Dups, Dups2) &&
|
||||
MeetIfcvtSizeLimit(*TrueBBI.BB, (TrueBBI.NonPredSize - (Dups + Dups2) +
|
||||
|
@ -1,8 +1,10 @@
|
||||
; RUN: llc < %s -march=arm
|
||||
; RUN: llc < %s -march=arm | grep subgt | count 1
|
||||
; RUN: llc < %s -march=arm | grep suble | count 1
|
||||
; FIXME: Check for # of unconditional branch after adding branch folding post ifcvt.
|
||||
; RUN: llc < %s -march=arm | FileCheck %s
|
||||
|
||||
; Do not if-convert when branches go to the different loops.
|
||||
; CHECK: _t:
|
||||
; CHECK-NOT: subgt
|
||||
; CHECK-NOT: suble
|
||||
; Don't use
|
||||
define i32 @t(i32 %a, i32 %b) {
|
||||
entry:
|
||||
%tmp1434 = icmp eq i32 %a, %b ; <i1> [#uses=1]
|
||||
|
@ -22,7 +22,6 @@ bb2: ; preds = %entry, %bb3
|
||||
%gotovar.4.0 = phi i8* [ %gotovar.4.0.pre, %bb3 ], [ %0, %entry ] ; <i8*> [#uses=1]
|
||||
; ARM: bx
|
||||
; THUMB: mov pc,
|
||||
; THUMB2: mov pc,
|
||||
indirectbr i8* %gotovar.4.0, [label %L5, label %L4, label %L3, label %L2, label %L1]
|
||||
|
||||
bb3: ; preds = %entry
|
||||
|
@ -32,15 +32,15 @@
|
||||
|
||||
define fastcc i32 @parse_percent_token() nounwind {
|
||||
entry:
|
||||
; CHECK: ittt eq
|
||||
; CHECK: ittt eq
|
||||
; CHECK: ittt eq
|
||||
; CHECK: ittt eq
|
||||
; CHECK: ittt eq
|
||||
; CHECK: moveq r0
|
||||
; CHECK-NOT: LBB0_
|
||||
; CHECK: ldreq
|
||||
; CHECK: popeq
|
||||
; CHECK: pop
|
||||
; CHECK: pop
|
||||
; CHECK: pop
|
||||
; CHECK: pop
|
||||
; CHECK: pop
|
||||
; CHECK: pop
|
||||
; CHECK: pop
|
||||
; Do not convert into single stream code. BranchProbability Analysis assumes
|
||||
; that branches which goes to "ret" intruction have lower probabilities.
|
||||
switch i32 undef, label %bb7 [
|
||||
i32 37, label %bb43
|
||||
i32 48, label %bb5
|
||||
|
@ -21,13 +21,13 @@ cond_next:
|
||||
ret i32 %tmp15
|
||||
}
|
||||
|
||||
; FIXME: Check for # of unconditional branch after adding branch folding post ifcvt.
|
||||
define i32 @t2(i32 %a, i32 %b) nounwind {
|
||||
entry:
|
||||
; Do not if-convert when branches go to the different loops.
|
||||
; CHECK: t2:
|
||||
; CHECK: ite gt
|
||||
; CHECK: subgt
|
||||
; CHECK: suble
|
||||
; CHECK-NOT: ite gt
|
||||
; CHECK-NOT: subgt
|
||||
; CHECK-NOT: suble
|
||||
%tmp1434 = icmp eq i32 %a, %b ; <i1> [#uses=1]
|
||||
br i1 %tmp1434, label %bb17, label %bb.outer
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user