diff options
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 6 |
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)); |