summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
diff options
context:
space:
mode:
authorDiego Novillo <dnovillo@google.com>2015-05-06 17:55:11 +0000
committerDiego Novillo <dnovillo@google.com>2015-05-06 17:55:11 +0000
commit14f94de1ee6487f2f254709383258aaa095b4cfe (patch)
tree54ae768c7a48727f1f534f8e032e72aca57d5a22 /llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
parentc6317d55e4eb7e5c3aaa2309f2bcae36b41ba75e (diff)
downloadbcm5719-llvm-14f94de1ee6487f2f254709383258aaa095b4cfe.tar.gz
bcm5719-llvm-14f94de1ee6487f2f254709383258aaa095b4cfe.zip
Allow 0-weight branches in BranchProbabilityInfo.
Summary: When computing branch weights in BPI, we used to disallow branches with weight 0. This is a minor nuisance, because a branch with weight 0 is different to "don't have information". In the context of instrumentation, it may mean "never executed", in the context of sampling, it means "never or seldom executed". In allowing 0 weight branches, I ran into issues with the switch expansion code in selection DAG. It is currently hardwired to not handle branches with weight 0. To maintain the current behaviour, I changed it to use 1 when it finds 0, but perhaps the algorithm needs changes to tolerate branches with weight zero. Reviewers: hansw Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D9533 llvm-svn: 236617
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index d0bda11eb05..fe96f33d772 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -8009,7 +8009,11 @@ void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
const ConstantInt *CaseVal = I.getCaseValue();
uint32_t Weight = 1;
if (BPI) {
- Weight = BPI->getEdgeWeight(SI.getParent(), I.getSuccessorIndex());
+ // TODO - BPI used to guarantee non-zero weights, but this produces
+ // information loss (see PR 22718). Since we can't handle zero weights
+ // here, use the same flooring mechanism previously used by BPI.
+ Weight = std::max(
+ 1u, BPI->getEdgeWeight(SI.getParent(), I.getSuccessorIndex()));
assert(Weight <= UINT32_MAX / SI.getNumSuccessors());
}
Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Weight));
OpenPOWER on IntegriCloud