================ @@ -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), ---------------- mingmingl-llvm wrote:
`drop_front` is clearer to me, despite `make_range` supersedes the ArrayRef usage in the updated patch. I became interested in why both `drop` and `take` exists, and it turns out (amusingly) that `take_{front,back}` [handles](https://github.com/llvm/llvm-project/blob/22d4ff155aadf0f098dd5dc48d9038da15108937/llvm/include/llvm/ADT/ArrayRef.h#L414-L426) `N>=size()` by returning the full view while `drop_{front,back}` [asserts](https://github.com/llvm/llvm-project/blob/22d4ff155aadf0f098dd5dc48d9038da15108937/llvm/include/llvm/ADT/ArrayRef.h#L389-L398) `N <= size()` (and slices a bogus length otherwise). 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