blockfreq: Skip irreducible backedges inside functions
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Tue, 22 Apr 2014 03:31:53 +0000 (03:31 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Tue, 22 Apr 2014 03:31:53 +0000 (03:31 +0000)
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

lib/Analysis/BlockFrequencyInfoImpl.cpp
test/Analysis/BlockFrequencyInfo/irreducible.ll

index b5532fcea1d058e63c8d8f519f606935b9d566d8..29a4117c1300d028725326bfa8d45e9a37b06ebd 100644 (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;
index 46a2958700ef922574bdb03a3785e6455d0e24bf..f0737fb48d5b235d98b5e11415a4671dbc166ec7 100644 (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
+}