diff options
| -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 +} |

