Lines Matching refs:Clusters
23 uint64_t SwitchCG::getJumpTableRange(const CaseClusterVector &Clusters, in getJumpTableRange() argument
26 const APInt &LowCase = Clusters[First].Low->getValue(); in getJumpTableRange()
27 const APInt &HighCase = Clusters[Last].High->getValue(); in getJumpTableRange()
46 void SwitchCG::SwitchLowering::findJumpTables(CaseClusterVector &Clusters, in findJumpTables() argument
54 assert(!Clusters.empty()); in findJumpTables()
55 for (CaseCluster &C : Clusters) in findJumpTables()
57 for (unsigned i = 1, e = Clusters.size(); i < e; ++i) in findJumpTables()
58 assert(Clusters[i - 1].High->getValue().slt(Clusters[i].Low->getValue())); in findJumpTables()
69 const int64_t N = Clusters.size(); in findJumpTables()
76 const APInt &Hi = Clusters[i].High->getValue(); in findJumpTables()
77 const APInt &Lo = Clusters[i].Low->getValue(); in findJumpTables()
83 uint64_t Range = getJumpTableRange(Clusters,0, N - 1); in findJumpTables()
91 if (buildJumpTable(Clusters, 0, N - 1, SI, SL, DefaultMBB, JTCluster)) { in findJumpTables()
92 Clusters[0] = JTCluster; in findJumpTables()
93 Clusters.resize(1); in findJumpTables()
142 Range = getJumpTableRange(Clusters, i, j); in findJumpTables()
181 buildJumpTable(Clusters, First, Last, SI, SL, DefaultMBB, JTCluster)) { in findJumpTables()
182 Clusters[DstIndex++] = JTCluster; in findJumpTables()
185 std::memmove(&Clusters[DstIndex++], &Clusters[I], sizeof(Clusters[I])); in findJumpTables()
188 Clusters.resize(DstIndex); in findJumpTables()
191 bool SwitchCG::SwitchLowering::buildJumpTable(const CaseClusterVector &Clusters, in buildJumpTable() argument
206 JTProbs[Clusters[I].MBB] = BranchProbability::getZero(); in buildJumpTable()
209 assert(Clusters[I].Kind == CC_Range); in buildJumpTable()
210 Prob += Clusters[I].Prob; in buildJumpTable()
211 const APInt &Low = Clusters[I].Low->getValue(); in buildJumpTable()
212 const APInt &High = Clusters[I].High->getValue(); in buildJumpTable()
216 const APInt &PreviousHigh = Clusters[I - 1].High->getValue(); in buildJumpTable()
224 Table.push_back(Clusters[I].MBB); in buildJumpTable()
225 JTProbs[Clusters[I].MBB] += Clusters[I].Prob; in buildJumpTable()
230 Clusters[First].Low->getValue(), in buildJumpTable()
231 Clusters[Last].High->getValue(), *DL)) { in buildJumpTable()
257 JumpTableHeader JTH(Clusters[First].Low->getValue(), in buildJumpTable()
258 Clusters[Last].High->getValue(), SI->getCondition(), in buildJumpTable()
262 JTCluster = CaseCluster::jumpTable(Clusters[First].Low, Clusters[Last].High, in buildJumpTable()
267 void SwitchCG::SwitchLowering::findBitTestClusters(CaseClusterVector &Clusters, in findBitTestClusters() argument
274 assert(!Clusters.empty()); in findBitTestClusters()
275 assert(Clusters[0].Kind == CC_Range || Clusters[0].Kind == CC_JumpTable); in findBitTestClusters()
276 for (const CaseCluster &C : Clusters) in findBitTestClusters()
278 for (unsigned i = 1; i < Clusters.size(); ++i) in findBitTestClusters()
279 assert(Clusters[i-1].High->getValue().slt(Clusters[i].Low->getValue())); in findBitTestClusters()
292 const int64_t N = Clusters.size(); in findBitTestClusters()
318 if (!TLI->rangeFitsInWord(Clusters[i].Low->getValue(), in findBitTestClusters()
319 Clusters[j].High->getValue(), *DL)) in findBitTestClusters()
327 if (Clusters[k].Kind != CC_Range) { in findBitTestClusters()
331 Dests.set(Clusters[k].MBB->getNumber()); in findBitTestClusters()
354 if (buildBitTests(Clusters, First, Last, SI, BitTestCluster)) { in findBitTestClusters()
355 Clusters[DstIndex++] = BitTestCluster; in findBitTestClusters()
358 std::memmove(&Clusters[DstIndex], &Clusters[First], in findBitTestClusters()
359 sizeof(Clusters[0]) * NumClusters); in findBitTestClusters()
363 Clusters.resize(DstIndex); in findBitTestClusters()
366 bool SwitchCG::SwitchLowering::buildBitTests(CaseClusterVector &Clusters, in buildBitTests() argument
377 assert(Clusters[I].Kind == CC_Range); in buildBitTests()
378 Dests.set(Clusters[I].MBB->getNumber()); in buildBitTests()
379 NumCmps += (Clusters[I].Low == Clusters[I].High) ? 1 : 2; in buildBitTests()
383 APInt Low = Clusters[First].Low->getValue(); in buildBitTests()
384 APInt High = Clusters[Last].High->getValue(); in buildBitTests()
401 if (Clusters[I].Low->getValue() != Clusters[I - 1].High->getValue() + 1) { in buildBitTests()
424 if (CBV[j].BB == Clusters[i].MBB) in buildBitTests()
428 CaseBits(0, Clusters[i].MBB, 0, BranchProbability::getZero())); in buildBitTests()
432 uint64_t Lo = (Clusters[i].Low->getValue() - LowBound).getZExtValue(); in buildBitTests()
433 uint64_t Hi = (Clusters[i].High->getValue() - LowBound).getZExtValue(); in buildBitTests()
437 CB->ExtraProb += Clusters[i].Prob; in buildBitTests()
438 TotalProb += Clusters[i].Prob; in buildBitTests()
461 BTCluster = CaseCluster::bitTests(Clusters[First].Low, Clusters[Last].High, in buildBitTests()
466 void SwitchCG::sortAndRangeify(CaseClusterVector &Clusters) { in sortAndRangeify() argument
468 for (const CaseCluster &CC : Clusters) in sortAndRangeify()
472 llvm::sort(Clusters, [](const CaseCluster &a, const CaseCluster &b) { in sortAndRangeify()
477 const unsigned N = Clusters.size(); in sortAndRangeify()
480 CaseCluster &CC = Clusters[SrcIndex]; in sortAndRangeify()
484 if (DstIndex != 0 && Clusters[DstIndex - 1].MBB == Succ && in sortAndRangeify()
485 (CaseVal->getValue() - Clusters[DstIndex - 1].High->getValue()) == 1) { in sortAndRangeify()
488 Clusters[DstIndex - 1].High = CaseVal; in sortAndRangeify()
489 Clusters[DstIndex - 1].Prob += CC.Prob; in sortAndRangeify()
491 std::memmove(&Clusters[DstIndex++], &Clusters[SrcIndex], in sortAndRangeify()
492 sizeof(Clusters[SrcIndex])); in sortAndRangeify()
495 Clusters.resize(DstIndex); in sortAndRangeify()