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:
Duncan P. N. Exon Smith 2014-04-22 03:31:53 +00:00
parent dda2f883dd
commit 846a14340c
2 changed files with 32 additions and 1 deletions

View File

@ -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;

View File

@ -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
}