mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
blockfreq: Skip irreducible backedges inside functions
The branch that skips irreducible backedges was only active when propagating mass at the top-level. In particular, when propagating mass through a loop recognized by `LoopInfo` with irreducible control flow inside, irreducible backedges would not be skipped. Not sure where that idea came from, but the result was that mass was lost until after loop exit. Added a testcase that covers this case. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206860 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
dda2f883dd
commit
846a14340c
@ -687,7 +687,7 @@ void BlockFrequencyInfoImplBase::addToDist(Distribution &Dist,
|
||||
return;
|
||||
}
|
||||
|
||||
if (!LoopHead.isValid() && Resolved < Pred) {
|
||||
if (Resolved < Pred) {
|
||||
// Irreducible backedge. Skip this edge in the distribution.
|
||||
DEBUG(debugSuccessor("skipped ", Resolved));
|
||||
return;
|
||||
|
@ -195,3 +195,34 @@ declare i32 @choose(i32)
|
||||
|
||||
!2 = metadata !{metadata !"branch_weights", i32 3, i32 1}
|
||||
!3 = metadata !{metadata !"branch_weights", i32 2, i32 2, i32 2}
|
||||
|
||||
; A reducible loop with irreducible control flow inside should still have
|
||||
; correct exit frequency.
|
||||
;
|
||||
; CHECK-LABEL: Printing analysis {{.*}} for function 'loop_around_irreducible':
|
||||
; CHECK-NEXT: block-frequency-info: loop_around_irreducible
|
||||
define void @loop_around_irreducible(i1 %x) {
|
||||
; CHECK-NEXT: entry: float = 1.0, int = [[ENTRY:[0-9]+]]
|
||||
entry:
|
||||
br label %loop
|
||||
|
||||
; CHECK-NEXT: loop: float = [[HEAD:[0-9.]+]], int = [[HEADINT:[0-9]+]]
|
||||
loop:
|
||||
br i1 %x, label %left, label %right
|
||||
|
||||
; CHECK-NEXT: left:
|
||||
left:
|
||||
br i1 %x, label %right, label %loop.end
|
||||
|
||||
; CHECK-NEXT: right:
|
||||
right:
|
||||
br i1 %x, label %left, label %loop.end
|
||||
|
||||
; CHECK-NEXT: loop.end: float = [[HEAD]], int = [[HEADINT]]
|
||||
loop.end:
|
||||
br i1 %x, label %loop, label %exit
|
||||
|
||||
; CHECK-NEXT: float = 1.0, int = [[ENTRY]]
|
||||
exit:
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user