diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-04-22 03:31:53 +0000 |
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-04-22 03:31:53 +0000 |
| commit | b3380ea60a3688e64bf6843553fa0c07363fdf76 (patch) | |
| tree | b87cb0f572f31afd3513f8030edcb0a1fbd0fdb2 | |
| parent | d1aec79d7ab57ca7c7387dc8b97f8a7b5f1d58c9 (diff) | |
| download | bcm5719-llvm-b3380ea60a3688e64bf6843553fa0c07363fdf76.tar.gz bcm5719-llvm-b3380ea60a3688e64bf6843553fa0c07363fdf76.zip | |
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.
llvm-svn: 206860
| -rw-r--r-- | llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp | 2 | ||||
| -rw-r--r-- | llvm/test/Analysis/BlockFrequencyInfo/irreducible.ll | 31 |
2 files changed, 32 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp b/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp index b5532fcea1d..29a4117c130 100644 --- a/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp +++ b/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp @@ -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; diff --git a/llvm/test/Analysis/BlockFrequencyInfo/irreducible.ll b/llvm/test/Analysis/BlockFrequencyInfo/irreducible.ll index 46a2958700e..f0737fb48d5 100644 --- a/llvm/test/Analysis/BlockFrequencyInfo/irreducible.ll +++ b/llvm/test/Analysis/BlockFrequencyInfo/irreducible.ll @@ -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 +} |

