================ @@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() { MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 || MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64, F); + + std::vector<unsigned> JumpTableIndices; + if (!TM.Options.EnableStaticDataPartitioning) { + for (unsigned JTI = 0, JTSize = JT.size(); JTI < JTSize; ++JTI) + JumpTableIndices.push_back(JTI); + emitJumpTables(JumpTableIndices, TLOF.getSectionForJumpTable(F, TM), + JTInDiffSection, *MJTI); + return; + } + + // When static data partitioning is enabled, collect jump table entries that + // go into the same section together to reduce the amount of section switch + // statements. + // + // Iterate all jump tables, put hot jump table indices towards the beginning + // of the vector, and cold jump table indices towards the end. Meanwhile + // retain the relative orders of original jump tables within a hot or unlikely + // section by reversing the cold jump table indices. + int NextHotJumpTableIndex = 0, NextColdJumpTableIndex = JT.size() - 1; + JumpTableIndices.resize(JT.size()); + for (unsigned JTI = 0, JTSize = JT.size(); JTI < JTSize; ++JTI) { + if (JT[JTI].Hotness == MachineFunctionDataHotness::Cold) + JumpTableIndices[NextColdJumpTableIndex--] = JTI; + else + JumpTableIndices[NextHotJumpTableIndex++] = JTI; + } + + if (NextHotJumpTableIndex != 0) { + emitJumpTables( + ArrayRef<unsigned>(JumpTableIndices).take_front(NextHotJumpTableIndex), + TLOF.getSectionForJumpTable(F, TM, &JT[0]), JTInDiffSection, *MJTI); + } + + if (NextHotJumpTableIndex < (int)JT.size()) { + // Reverse the order of cold jump tables indices. + for (int L = NextHotJumpTableIndex, R = JT.size() - 1; L < R; ++L, --R) + std::swap(JumpTableIndices[L], JumpTableIndices[R]); + + emitJumpTables( + ArrayRef<unsigned>(JumpTableIndices) + .take_back(JT.size() - NextHotJumpTableIndex), + TLOF.getSectionForJumpTable( + F, TM, &JT[JumpTableIndices[NextHotJumpTableIndex]]), + JTInDiffSection, *MJTI); + } + + return; +} + +void AsmPrinter::emitJumpTables(ArrayRef<unsigned> JumpTableIndices, + MCSection *JumpTableSection, + bool JTInDiffSection, + const MachineJumpTableInfo &MJTI) { + if (JumpTableIndices.empty()) + return; + + const DataLayout &DL = MF->getDataLayout(); if (JTInDiffSection) { - // Drop it in the readonly section. - MCSection *ReadOnlySection = TLOF.getSectionForJumpTable(F, TM); - OutStreamer->switchSection(ReadOnlySection); + OutStreamer->switchSection(JumpTableSection); } - emitAlignment(Align(MJTI->getEntryAlignment(DL))); + emitAlignment(Align(MJTI.getEntryAlignment(MF->getDataLayout()))); // Jump tables in code sections are marked with a data_region directive // where that's supported. if (!JTInDiffSection) OutStreamer->emitDataRegion(MCDR_DataRegionJT32); - for (unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) { - const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs; + const auto &JT = MJTI.getJumpTables(); + for (unsigned Index = 0, e = JumpTableIndices.size(); Index != e; ++Index) { ---------------- ellishg wrote:
Then you can replace `JT[JumpTableIndices[Index]]` -> `JT[JTIndex]` ```suggestion for (auto JTIndex : JumpTableIndices) { ``` https://github.com/llvm/llvm-project/pull/122215 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits