From 7bf4d4eee01df4debe56daa02912a479970c38f4 Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Mon, 27 Apr 2015 23:52:19 +0000 Subject: [PATCH] Switch lowering: use uint32_t for weights everywhere I previously thought switch clusters would need to use uint64_t in case the weights of multiple cases overflowed a 32-bit int. It turns out that the weights on a terminator instruction are capped to allow for being added together, so using a uint32_t should be safe. llvm-svn: 235945 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 16 +++++++++++----- llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 985a4df..71b221a0 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -2126,6 +2126,7 @@ void SelectionDAGBuilder::sortAndRangeify(CaseClusterVector &Clusters) { // the previous cluster. Clusters[DstIndex - 1].High = CaseVal; Clusters[DstIndex - 1].Weight += CC.Weight; + assert(Clusters[DstIndex - 1].Weight >= CC.Weight && "Weight overflow!"); } else { std::memmove(&Clusters[DstIndex++], &Clusters[SrcIndex], sizeof(Clusters[SrcIndex])); @@ -7230,13 +7231,14 @@ bool SelectionDAGBuilder::buildJumpTable(CaseClusterVector &Clusters, CaseCluster &JTCluster) { assert(First <= Last); - uint64_t Weight = 0; + uint32_t Weight = 0; unsigned NumCmps = 0; std::vector Table; DenseMap JTWeights; for (unsigned I = First; I <= Last; ++I) { assert(Clusters[I].Kind == CC_Range); Weight += Clusters[I].Weight; + assert(Weight >= Clusters[I].Weight && "Weight overflow!"); APInt Low = Clusters[I].Low->getValue(); APInt High = Clusters[I].High->getValue(); NumCmps += (Low == High) ? 1 : 2; @@ -7463,7 +7465,7 @@ bool SelectionDAGBuilder::buildBitTests(CaseClusterVector &Clusters, } CaseBitsVector CBV; - uint64_t TotalWeight = 0; + uint32_t TotalWeight = 0; for (unsigned i = First; i <= Last; ++i) { // Find the CaseBits for this destination. unsigned j; @@ -7482,8 +7484,8 @@ bool SelectionDAGBuilder::buildBitTests(CaseClusterVector &Clusters, CB->Bits++; } CB->ExtraWeight += Clusters[i].Weight; - assert(CB->ExtraWeight >= Clusters[i].Weight && "Weight sum overflowed!"); TotalWeight += Clusters[i].Weight; + assert(TotalWeight >= Clusters[i].Weight && "Weight overflow!"); } BitTestInfo BTI; @@ -7693,8 +7695,10 @@ void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond, // Compute total weight. uint32_t UnhandledWeights = 0; - for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I) + for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I) { UnhandledWeights += I->Weight; + assert(UnhandledWeights >= I->Weight && "Weight overflow!"); + } MachineBasicBlock *CurMBB = W.MBB; for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) { @@ -7859,8 +7863,10 @@ void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) { MachineBasicBlock *Succ = FuncInfo.MBBMap[I.getCaseSuccessor()]; const ConstantInt *CaseVal = I.getCaseValue(); uint32_t Weight = 0; // FIXME: Use 1 instead? - if (BPI) + if (BPI) { Weight = BPI->getEdgeWeight(SI.getParent(), I.getSuccessorIndex()); + assert(Weight <= UINT32_MAX / SI.getNumSuccessors()); + } Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Weight)); } diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h index 7c2cef6..ba6d974 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h @@ -153,7 +153,7 @@ private: unsigned JTCasesIndex; unsigned BTCasesIndex; }; - uint64_t Weight; + uint32_t Weight; static CaseCluster range(const ConstantInt *Low, const ConstantInt *High, MachineBasicBlock *MBB, uint32_t Weight) { -- 2.7.4