]> granicus.if.org Git - llvm/commitdiff
Revert part of "Cleanup some GraphTraits iteration code"
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 8 Dec 2017 22:42:43 +0000 (22:42 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 8 Dec 2017 22:42:43 +0000 (22:42 +0000)
This reverts part of r300656, which caused a regression in
propagateMassToSuccessors by counting edges n^2 times, where n is the
number of edges from the source basic block to the same successor basic
block. The result was both incorrect and very slow to compute for large
values of n (e.g. switches with multiple cases that go to the same basic
block).

Patch by Andrew Scheidecker!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@320208 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/BlockFrequencyInfoImpl.h
test/Analysis/BlockFrequencyInfo/redundant_edges.ll [new file with mode: 0644]

index 228934cb3013ff1d8e061c4b6d628debbef16688..24295a2569fd90fdf4223469a7aaa9108d98487f 100644 (file)
@@ -1314,9 +1314,12 @@ BlockFrequencyInfoImpl<BT>::propagateMassToSuccessors(LoopData *OuterLoop,
       return false;
   } else {
     const BlockT *BB = getBlock(Node);
-    for (const auto Succ : children<const BlockT *>(BB))
-      if (!addToDist(Dist, OuterLoop, Node, getNode(Succ),
-                     getWeightFromBranchProb(BPI->getEdgeProbability(BB, Succ))))
+    for (auto SI = GraphTraits<const BlockT *>::child_begin(BB),
+              SE = GraphTraits<const BlockT *>::child_end(BB);
+         SI != SE; ++SI)
+      if (!addToDist(
+              Dist, OuterLoop, Node, getNode(*SI),
+              getWeightFromBranchProb(BPI->getEdgeProbability(BB, SI))))
         // Irreducible backedge.
         return false;
   }
diff --git a/test/Analysis/BlockFrequencyInfo/redundant_edges.ll b/test/Analysis/BlockFrequencyInfo/redundant_edges.ll
new file mode 100644 (file)
index 0000000..20ed140
--- /dev/null
@@ -0,0 +1,22 @@
+; RUN: opt < %s -analyze -block-freq | FileCheck %s
+; RUN: opt < %s -analyze -lazy-block-freq | FileCheck %s
+; RUN: opt < %s -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s
+
+define void @test1() {
+; CHECK-LABEL: Printing analysis {{.*}} for function 'test1':
+; CHECK-NEXT: block-frequency-info: test1
+; CHECK-NEXT: entry: float = 1.0, int = [[ENTRY:[0-9]+]]
+entry:
+  br label %loop
+
+; CHECK-NEXT: loop: float = 32.0
+loop:
+  switch i32 undef, label %loop [
+    i32 0, label %return
+    i32 1, label %return
+  ]
+
+; CHECK-NEXT: return: float = 1.0
+return:
+  ret void
+}