diff options
| author | Cong Hou <congh@google.com> | 2015-08-26 23:15:32 +0000 |
|---|---|---|
| committer | Cong Hou <congh@google.com> | 2015-08-26 23:15:32 +0000 |
| commit | 03127700d5eddf373eced331c4a8a5f07bd0adfe (patch) | |
| tree | fe1d8c7888fb450bae52fb8db33878dab9f0980b /llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | |
| parent | ca22b869dc3ed2a3f535da31062735671880a5f8 (diff) | |
| download | bcm5719-llvm-03127700d5eddf373eced331c4a8a5f07bd0adfe.tar.gz bcm5719-llvm-03127700d5eddf373eced331c4a8a5f07bd0adfe.zip | |
Assign weights to edges to jump table / bit test header when lowering switch statement.
Currently, when lowering switch statement and a new basic block is built for jump table / bit test header, the edge to this new block is not assigned with a correct weight. This patch collects the edge weight from all its successors and assign this sum of weights to the edge (and also the other fall-through edge). Test cases are adjusted accordingly.
Differential Revision: http://reviews.llvm.org/D12166#fae6eca7
llvm-svn: 246104
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index c0a1480dbd3..9ccd6267492 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -1897,8 +1897,9 @@ void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock &B, MachineBasicBlock* MBB = B.Cases[0].ThisBB; - addSuccessorWithWeight(SwitchBB, B.Default); - addSuccessorWithWeight(SwitchBB, MBB); + uint32_t DefaultWeight = getEdgeWeight(SwitchBB, B.Default); + addSuccessorWithWeight(SwitchBB, B.Default, DefaultWeight); + addSuccessorWithWeight(SwitchBB, MBB, B.Weight); SDValue BrRange = DAG.getNode(ISD::BRCOND, dl, MVT::Other, CopyTo, RangeCmp, @@ -7820,7 +7821,8 @@ bool SelectionDAGBuilder::buildBitTests(CaseClusterVector &Clusters, } BitTestCases.emplace_back(std::move(LowBound), std::move(CmpRange), SI->getCondition(), -1U, MVT::Other, false, - ContiguousRange, nullptr, nullptr, std::move(BTI)); + ContiguousRange, nullptr, nullptr, std::move(BTI), + TotalWeight); BTCluster = CaseCluster::bitTests(Clusters[First].Low, Clusters[Last].High, BitTestCases.size() - 1, TotalWeight); @@ -8041,8 +8043,16 @@ void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond, // The jump block hasn't been inserted yet; insert it here. MachineBasicBlock *JumpMBB = JT->MBB; CurMF->insert(BBI, JumpMBB); - addSuccessorWithWeight(CurMBB, Fallthrough); - addSuccessorWithWeight(CurMBB, JumpMBB); + + // Collect the sum of weights of outgoing edges from JumpMBB, which will + // be the edge weight on CurMBB->JumpMBB. + uint32_t JumpWeight = 0; + for (auto Succ : JumpMBB->successors()) + JumpWeight += getEdgeWeight(JumpMBB, Succ); + uint32_t FallthruWeight = getEdgeWeight(CurMBB, Fallthrough); + + addSuccessorWithWeight(CurMBB, Fallthrough, FallthruWeight); + addSuccessorWithWeight(CurMBB, JumpMBB, JumpWeight); // The jump table header will be inserted in our current block, do the // range check, and fall through to our fallthrough block. |

