Fix PR 24723 - Handle 0-mass backedges in irreducible loops

This corner case happens when we have an irreducible SCC that is
deeply nested.  As we work down the tree, the backedge masses start
getting smaller and smaller until we reach one that is down to 0.

Since we distribute the incoming mass using the backedge masses as
weight, the distributor does not allow zero weights.  So, we simply
ignore them (which will just use the weights of the non-zero nodes).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247050 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Diego Novillo 2015-09-08 19:22:17 +00:00
parent 5bd1a50ca2
commit 965f2c2437
2 changed files with 159 additions and 1 deletions

View File

@ -743,7 +743,10 @@ void BlockFrequencyInfoImplBase::adjustLoopHeaderMass(LoopData &Loop) {
auto &BackedgeMass = Loop.BackedgeMass[Loop.getHeaderIndex(HeaderNode)];
DEBUG(dbgs() << " - Add back edge mass for node "
<< getBlockName(HeaderNode) << ": " << BackedgeMass << "\n");
Dist.addLocal(HeaderNode, BackedgeMass.getMass());
if (BackedgeMass.getMass() > 0)
Dist.addLocal(HeaderNode, BackedgeMass.getMass());
else
DEBUG(dbgs() << " Nothing added. Back edge mass is zero\n");
}
DitheringDistributer D(Dist, LoopMass);

View File

@ -0,0 +1,155 @@
; RUN: opt < %s -analyze -block-freq
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define void @fn1(i32* %f) {
entry:
%tobool7 = icmp eq i32 undef, 0
br i1 undef, label %if.end.12, label %for.body.5
for.inc:
store i32 undef, i32* %f, align 4
br label %for.body.5
for.body.5: ; preds = %for.cond.4.preheader
br i1 %tobool7, label %for.inc.9, label %for.inc
for.inc.9: ; preds = %for.body.5
br i1 %tobool7, label %for.inc.9.1, label %for.inc
if.end.12: ; preds = %if.end.12, %for.body
br i1 undef, label %for.end.17, label %for.inc
for.end.17: ; preds = %entry
ret void
for.inc.9.1: ; preds = %for.inc.9
br i1 %tobool7, label %for.inc.9.2, label %for.inc
for.inc.9.2: ; preds = %for.inc.9.1
br i1 %tobool7, label %for.inc.9.3, label %for.inc
for.inc.9.3: ; preds = %for.inc.9.2
br i1 %tobool7, label %for.inc.9.4, label %for.inc
for.inc.9.4: ; preds = %for.inc.9.3
br i1 %tobool7, label %for.inc.9.5, label %for.inc
for.inc.9.5: ; preds = %for.inc.9.4
br i1 %tobool7, label %for.inc.9.6, label %for.inc
for.inc.9.6: ; preds = %for.inc.9.5
br i1 %tobool7, label %for.inc.9.7, label %for.inc
for.inc.9.7: ; preds = %for.inc.9.6
br i1 %tobool7, label %for.inc.9.8, label %for.inc
for.inc.9.8: ; preds = %for.inc.9.7
br i1 %tobool7, label %for.inc.9.9, label %for.inc
for.inc.9.9: ; preds = %for.inc.9.8
br i1 %tobool7, label %for.inc.9.10, label %for.inc
for.inc.9.10: ; preds = %for.inc.9.9
br i1 %tobool7, label %for.inc.9.11, label %for.inc
for.inc.9.11: ; preds = %for.inc.9.10
br i1 %tobool7, label %for.inc.9.12, label %for.inc
for.inc.9.12: ; preds = %for.inc.9.11
br i1 %tobool7, label %for.inc.9.13, label %for.inc
for.inc.9.13: ; preds = %for.inc.9.12
br i1 %tobool7, label %for.inc.9.14, label %for.inc
for.inc.9.14: ; preds = %for.inc.9.13
br i1 %tobool7, label %for.inc.9.15, label %for.inc
for.inc.9.15: ; preds = %for.inc.9.14
br i1 %tobool7, label %for.inc.9.16, label %for.inc
for.inc.9.16: ; preds = %for.inc.9.15
br i1 %tobool7, label %for.inc.9.17, label %for.inc
for.inc.9.17: ; preds = %for.inc.9.16
br i1 %tobool7, label %for.inc.9.18, label %for.inc
for.inc.9.18: ; preds = %for.inc.9.17
br i1 %tobool7, label %for.inc.9.19, label %for.inc
for.inc.9.19: ; preds = %for.inc.9.18
br i1 %tobool7, label %for.inc.9.20, label %for.inc
for.inc.9.20: ; preds = %for.inc.9.19
br i1 %tobool7, label %for.inc.9.21, label %for.inc
for.inc.9.21: ; preds = %for.inc.9.20
br i1 %tobool7, label %for.inc.9.22, label %for.inc
for.inc.9.22: ; preds = %for.inc.9.21
br i1 %tobool7, label %for.inc.9.23, label %for.inc
for.inc.9.23: ; preds = %for.inc.9.22
br i1 %tobool7, label %for.inc.9.24, label %for.inc
for.inc.9.24: ; preds = %for.inc.9.23
br i1 %tobool7, label %for.inc.9.25, label %for.inc
for.inc.9.25: ; preds = %for.inc.9.24
br i1 %tobool7, label %for.inc.9.26, label %for.inc
for.inc.9.26: ; preds = %for.inc.9.25
br i1 %tobool7, label %for.inc.9.27, label %for.inc
for.inc.9.27: ; preds = %for.inc.9.26
br i1 %tobool7, label %for.inc.9.28, label %for.inc
for.inc.9.28: ; preds = %for.inc.9.27
br i1 %tobool7, label %for.inc.9.29, label %for.inc
for.inc.9.29: ; preds = %for.inc.9.28
br i1 %tobool7, label %for.inc.9.30, label %for.inc
for.inc.9.30: ; preds = %for.inc.9.29
br i1 %tobool7, label %for.inc.9.31, label %for.inc
for.inc.9.31: ; preds = %for.inc.9.30
br i1 %tobool7, label %for.inc.9.32, label %for.inc
for.inc.9.32: ; preds = %for.inc.9.31
br i1 %tobool7, label %for.inc.9.33, label %for.inc
for.inc.9.33: ; preds = %for.inc.9.32
br i1 %tobool7, label %for.inc.9.34, label %for.inc
for.inc.9.34: ; preds = %for.inc.9.33
br i1 %tobool7, label %for.inc.9.35, label %for.inc
for.inc.9.35: ; preds = %for.inc.9.34
br i1 %tobool7, label %for.inc.9.36, label %for.inc
for.inc.9.36: ; preds = %for.inc.9.35
br i1 %tobool7, label %for.inc.9.37, label %for.inc
for.inc.9.37: ; preds = %for.inc.9.36
br i1 %tobool7, label %for.inc.9.38, label %for.inc
for.inc.9.38: ; preds = %for.inc.9.37
br i1 %tobool7, label %for.inc.9.39, label %for.inc
for.inc.9.39: ; preds = %for.inc.9.38
br i1 %tobool7, label %for.inc.9.40, label %for.inc
for.inc.9.40: ; preds = %for.inc.9.39
br i1 %tobool7, label %for.inc.9.41, label %for.inc
for.inc.9.41: ; preds = %for.inc.9.40
br i1 %tobool7, label %for.inc.9.42, label %for.inc
for.inc.9.42: ; preds = %for.inc.9.41
br i1 %tobool7, label %for.inc.9.43, label %for.inc
for.inc.9.43: ; preds = %for.inc.9.42
br i1 %tobool7, label %if.end.12, label %for.inc
}