mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-20 19:42:54 +02:00
[LoopUnswitch] Remove BFI usage (dead code)
Chandler mentioned at the last social that the need for BFI in the new pass manager was causing a slight hiccup for this pass. Given this code has been checked in, but off for over a year, it makes sense to just remove it for now. Note that there's nothing wrong with the general idea - it's actually a quite good one - and once we have the infrastructure in place to implement this without the full recompuation on every loop, we absolutely should. llvm-svn: 294715
This commit is contained in:
parent
dd1f0a3f3a
commit
278a638de5
@ -77,19 +77,6 @@ static cl::opt<unsigned>
|
|||||||
Threshold("loop-unswitch-threshold", cl::desc("Max loop size to unswitch"),
|
Threshold("loop-unswitch-threshold", cl::desc("Max loop size to unswitch"),
|
||||||
cl::init(100), cl::Hidden);
|
cl::init(100), cl::Hidden);
|
||||||
|
|
||||||
static cl::opt<bool>
|
|
||||||
LoopUnswitchWithBlockFrequency("loop-unswitch-with-block-frequency",
|
|
||||||
cl::init(false), cl::Hidden,
|
|
||||||
cl::desc("Enable the use of the block frequency analysis to access PGO "
|
|
||||||
"heuristics to minimize code growth in cold regions."));
|
|
||||||
|
|
||||||
static cl::opt<unsigned>
|
|
||||||
ColdnessThreshold("loop-unswitch-coldness-threshold", cl::init(1), cl::Hidden,
|
|
||||||
cl::desc("Coldness threshold in percentage. The loop header frequency "
|
|
||||||
"(relative to the entry frequency) is compared with this "
|
|
||||||
"threshold to determine if non-trivial unswitching should be "
|
|
||||||
"enabled."));
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
class LUAnalysisCache {
|
class LUAnalysisCache {
|
||||||
@ -174,13 +161,6 @@ namespace {
|
|||||||
|
|
||||||
LUAnalysisCache BranchesInfo;
|
LUAnalysisCache BranchesInfo;
|
||||||
|
|
||||||
bool EnabledPGO;
|
|
||||||
|
|
||||||
// BFI and ColdEntryFreq are only used when PGO and
|
|
||||||
// LoopUnswitchWithBlockFrequency are enabled.
|
|
||||||
BlockFrequencyInfo BFI;
|
|
||||||
BlockFrequency ColdEntryFreq;
|
|
||||||
|
|
||||||
bool OptimizeForSize;
|
bool OptimizeForSize;
|
||||||
bool redoLoop;
|
bool redoLoop;
|
||||||
|
|
||||||
@ -457,19 +437,6 @@ bool LoopUnswitch::runOnLoop(Loop *L, LPPassManager &LPM_Ref) {
|
|||||||
if (SanitizeMemory)
|
if (SanitizeMemory)
|
||||||
computeLoopSafetyInfo(&SafetyInfo, L);
|
computeLoopSafetyInfo(&SafetyInfo, L);
|
||||||
|
|
||||||
EnabledPGO = F->getEntryCount().hasValue();
|
|
||||||
|
|
||||||
if (LoopUnswitchWithBlockFrequency && EnabledPGO) {
|
|
||||||
BranchProbabilityInfo BPI(*F, *LI);
|
|
||||||
BFI.calculate(*L->getHeader()->getParent(), BPI, *LI);
|
|
||||||
|
|
||||||
// Use BranchProbability to compute a minimum frequency based on
|
|
||||||
// function entry baseline frequency. Loops with headers below this
|
|
||||||
// frequency are considered as cold.
|
|
||||||
const BranchProbability ColdProb(ColdnessThreshold, 100);
|
|
||||||
ColdEntryFreq = BlockFrequency(BFI.getEntryFreq()) * ColdProb;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
do {
|
do {
|
||||||
assert(currentLoop->isLCSSAForm(*DT));
|
assert(currentLoop->isLCSSAForm(*DT));
|
||||||
@ -581,16 +548,6 @@ bool LoopUnswitch::processCurrentLoop() {
|
|||||||
loopHeader->getParent()->hasFnAttribute(Attribute::OptimizeForSize))
|
loopHeader->getParent()->hasFnAttribute(Attribute::OptimizeForSize))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (LoopUnswitchWithBlockFrequency && EnabledPGO) {
|
|
||||||
// Compute the weighted frequency of the hottest block in the
|
|
||||||
// loop (loopHeader in this case since inner loops should be
|
|
||||||
// processed before outer loop). If it is less than ColdFrequency,
|
|
||||||
// we should not unswitch.
|
|
||||||
BlockFrequency LoopEntryFreq = BFI.getBlockFreq(loopHeader);
|
|
||||||
if (LoopEntryFreq < ColdEntryFreq)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (IntrinsicInst *Guard : Guards) {
|
for (IntrinsicInst *Guard : Guards) {
|
||||||
Value *LoopCond =
|
Value *LoopCond =
|
||||||
FindLIVLoopCondition(Guard->getOperand(0), currentLoop, Changed);
|
FindLIVLoopCondition(Guard->getOperand(0), currentLoop, Changed);
|
||||||
|
@ -1,52 +0,0 @@
|
|||||||
; RUN: opt < %s -loop-unswitch -loop-unswitch-with-block-frequency -S 2>&1 | FileCheck %s
|
|
||||||
|
|
||||||
;; trivial condition should be unswithed regardless of coldness.
|
|
||||||
define i32 @test1(i1 %cond1, i1 %cond2) !prof !1 {
|
|
||||||
br i1 %cond1, label %loop_begin, label %loop_exit, !prof !0
|
|
||||||
|
|
||||||
loop_begin:
|
|
||||||
; CHECK: br i1 true, label %continue, label %loop_exit.loopexit
|
|
||||||
br i1 %cond2, label %continue, label %loop_exit ; trivial condition
|
|
||||||
|
|
||||||
continue:
|
|
||||||
call void @some_func1() noreturn nounwind
|
|
||||||
br label %loop_begin
|
|
||||||
|
|
||||||
loop_exit:
|
|
||||||
ret i32 0
|
|
||||||
}
|
|
||||||
|
|
||||||
;; cold non-trivial condition should not be unswitched.
|
|
||||||
define i32 @test2(i32* %var, i1 %cond1, i1 %cond2) !prof !1 {
|
|
||||||
br i1 %cond1, label %loop_begin, label %loop_exit, !prof !0
|
|
||||||
|
|
||||||
loop_begin:
|
|
||||||
store i32 1, i32* %var
|
|
||||||
; CHECK: br i1 %cond2, label %continue1, label %continue2
|
|
||||||
br i1 %cond2, label %continue1, label %continue2 ; non-trivial condition
|
|
||||||
|
|
||||||
continue1:
|
|
||||||
call void @some_func1() noreturn nounwind
|
|
||||||
br label %joint
|
|
||||||
|
|
||||||
continue2:
|
|
||||||
call void @some_func2() noreturn nounwind
|
|
||||||
br label %joint
|
|
||||||
|
|
||||||
joint:
|
|
||||||
;; unswitching will duplicate these calls.
|
|
||||||
call void @some_func3() noreturn nounwind
|
|
||||||
call void @some_func4() noreturn nounwind
|
|
||||||
br label %loop_begin
|
|
||||||
|
|
||||||
loop_exit:
|
|
||||||
ret i32 0
|
|
||||||
}
|
|
||||||
|
|
||||||
declare void @some_func1() noreturn
|
|
||||||
declare void @some_func2() noreturn
|
|
||||||
declare void @some_func3() noreturn
|
|
||||||
declare void @some_func4() noreturn
|
|
||||||
|
|
||||||
!0 = !{!"branch_weights", i32 1, i32 100000000}
|
|
||||||
!1 = !{!"function_entry_count", i64 100}
|
|
Loading…
Reference in New Issue
Block a user