mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-14 22:38:03 +00:00
PGO: preserve branch-weight metadata when simplifying SwitchOnSelect.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164068 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
97d552e5c7
commit
b11cbe6b23
@ -2213,7 +2213,9 @@ static bool SimplifyCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI) {
|
||||
// Also makes sure not to introduce new successors by assuming that edges to
|
||||
// non-successor TrueBBs and FalseBBs aren't reachable.
|
||||
static bool SimplifyTerminatorOnSelect(TerminatorInst *OldTerm, Value *Cond,
|
||||
BasicBlock *TrueBB, BasicBlock *FalseBB){
|
||||
BasicBlock *TrueBB, BasicBlock *FalseBB,
|
||||
uint32_t TrueWeight,
|
||||
uint32_t FalseWeight){
|
||||
// Remove any superfluous successor edges from the CFG.
|
||||
// First, figure out which successors to preserve.
|
||||
// If TrueBB and FalseBB are equal, only try to preserve one copy of that
|
||||
@ -2242,10 +2244,15 @@ static bool SimplifyTerminatorOnSelect(TerminatorInst *OldTerm, Value *Cond,
|
||||
// We were only looking for one successor, and it was present.
|
||||
// Create an unconditional branch to it.
|
||||
Builder.CreateBr(TrueBB);
|
||||
else
|
||||
else {
|
||||
// We found both of the successors we were looking for.
|
||||
// Create a conditional branch sharing the condition of the select.
|
||||
Builder.CreateCondBr(Cond, TrueBB, FalseBB);
|
||||
BranchInst *NewBI = Builder.CreateCondBr(Cond, TrueBB, FalseBB);
|
||||
if (TrueWeight != FalseWeight)
|
||||
NewBI->setMetadata(LLVMContext::MD_prof,
|
||||
MDBuilder(OldTerm->getContext()).
|
||||
createBranchWeights(TrueWeight, FalseWeight));
|
||||
}
|
||||
} else if (KeepEdge1 && (KeepEdge2 || TrueBB == FalseBB)) {
|
||||
// Neither of the selected blocks were successors, so this
|
||||
// terminator must be unreachable.
|
||||
@ -2282,8 +2289,23 @@ static bool SimplifySwitchOnSelect(SwitchInst *SI, SelectInst *Select) {
|
||||
BasicBlock *TrueBB = SI->findCaseValue(TrueVal).getCaseSuccessor();
|
||||
BasicBlock *FalseBB = SI->findCaseValue(FalseVal).getCaseSuccessor();
|
||||
|
||||
// Get weight for TrueBB and FalseBB.
|
||||
uint32_t TrueWeight = 0, FalseWeight = 0;
|
||||
SmallVector<uint64_t, 8> Weights;
|
||||
bool HasWeights = HasBranchWeights(SI);
|
||||
if (HasWeights) {
|
||||
GetBranchWeights(SI, Weights);
|
||||
if (Weights.size() == 1 + SI->getNumCases()) {
|
||||
TrueWeight = (uint32_t)Weights[SI->findCaseValue(TrueVal).
|
||||
getSuccessorIndex()];
|
||||
FalseWeight = (uint32_t)Weights[SI->findCaseValue(FalseVal).
|
||||
getSuccessorIndex()];
|
||||
}
|
||||
}
|
||||
|
||||
// Perform the actual simplification.
|
||||
return SimplifyTerminatorOnSelect(SI, Condition, TrueBB, FalseBB);
|
||||
return SimplifyTerminatorOnSelect(SI, Condition, TrueBB, FalseBB,
|
||||
TrueWeight, FalseWeight);
|
||||
}
|
||||
|
||||
// SimplifyIndirectBrOnSelect - Replaces
|
||||
@ -2303,7 +2325,8 @@ static bool SimplifyIndirectBrOnSelect(IndirectBrInst *IBI, SelectInst *SI) {
|
||||
BasicBlock *FalseBB = FBA->getBasicBlock();
|
||||
|
||||
// Perform the actual simplification.
|
||||
return SimplifyTerminatorOnSelect(IBI, SI->getCondition(), TrueBB, FalseBB);
|
||||
return SimplifyTerminatorOnSelect(IBI, SI->getCondition(), TrueBB, FalseBB,
|
||||
0, 0);
|
||||
}
|
||||
|
||||
/// TryToSimplifyUncondBranchWithICmpInIt - This is called when we find an icmp
|
||||
|
@ -193,6 +193,29 @@ Z:
|
||||
ret void
|
||||
}
|
||||
|
||||
; Test basic folding to a conditional branch.
|
||||
define void @test8(i64 %x, i64 %y) nounwind {
|
||||
; CHECK: @test8
|
||||
entry:
|
||||
%lt = icmp slt i64 %x, %y
|
||||
; CHECK: br i1 %lt, label %a, label %b, !prof !6
|
||||
%qux = select i1 %lt, i32 0, i32 2
|
||||
switch i32 %qux, label %bees [
|
||||
i32 0, label %a
|
||||
i32 1, label %b
|
||||
i32 2, label %b
|
||||
], !prof !7
|
||||
a:
|
||||
call void @helper(i32 0) nounwind
|
||||
ret void
|
||||
b:
|
||||
call void @helper(i32 1) nounwind
|
||||
ret void
|
||||
bees:
|
||||
call void @helper(i32 2) nounwind
|
||||
ret void
|
||||
}
|
||||
|
||||
!0 = metadata !{metadata !"branch_weights", i32 3, i32 5}
|
||||
!1 = metadata !{metadata !"branch_weights", i32 1, i32 1}
|
||||
!2 = metadata !{metadata !"branch_weights", i32 1, i32 2}
|
||||
@ -200,6 +223,7 @@ Z:
|
||||
!4 = metadata !{metadata !"branch_weights", i32 4, i32 3, i32 2, i32 1}
|
||||
!5 = metadata !{metadata !"branch_weights", i32 7, i32 6, i32 5}
|
||||
!6 = metadata !{metadata !"branch_weights", i32 1, i32 3}
|
||||
!7 = metadata !{metadata !"branch_weights", i32 33, i32 9, i32 8, i32 7}
|
||||
|
||||
; CHECK: !0 = metadata !{metadata !"branch_weights", i32 5, i32 11}
|
||||
; CHECK: !1 = metadata !{metadata !"branch_weights", i32 1, i32 5}
|
||||
@ -207,4 +231,5 @@ Z:
|
||||
; CHECK: !3 = metadata !{metadata !"branch_weights", i32 49, i32 12, i32 24, i32 35}
|
||||
; CHECK: !4 = metadata !{metadata !"branch_weights", i32 11, i32 5}
|
||||
; CHECK: !5 = metadata !{metadata !"branch_weights", i32 17, i32 15}
|
||||
; CHECK-NOT: !6
|
||||
; CHECK: !6 = metadata !{metadata !"branch_weights", i32 9, i32 7}
|
||||
; CHECK-NOT: !7
|
||||
|
Loading…
x
Reference in New Issue
Block a user