aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/CodeGen/MachineFunctionSplitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/MachineFunctionSplitter.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/CodeGen/MachineFunctionSplitter.cpp23
1 files changed, 9 insertions, 14 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/MachineFunctionSplitter.cpp b/contrib/llvm-project/llvm/lib/CodeGen/MachineFunctionSplitter.cpp
index fbc071536d22..38c1c56d2823 100644
--- a/contrib/llvm-project/llvm/lib/CodeGen/MachineFunctionSplitter.cpp
+++ b/contrib/llvm-project/llvm/lib/CodeGen/MachineFunctionSplitter.cpp
@@ -35,6 +35,7 @@
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/Passes.h"
+#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/IR/Function.h"
#include "llvm/InitializePasses.h"
#include "llvm/Support/CommandLine.h"
@@ -108,6 +109,12 @@ static bool isColdBlock(const MachineBasicBlock &MBB,
const MachineBlockFrequencyInfo *MBFI,
ProfileSummaryInfo *PSI) {
std::optional<uint64_t> Count = MBFI->getBlockProfileCount(&MBB);
+
+ // Temporary hack to cope with AArch64's jump table encoding
+ const TargetInstrInfo &TII = *MBB.getParent()->getSubtarget().getInstrInfo();
+ if (!TII.isMBBSafeToSplitToCold(MBB))
+ return false;
+
// For instrumentation profiles and sample profiles, we use different ways
// to judge whether a block is cold and should be split.
if (PSI->hasInstrumentationProfile() || PSI->hasCSInstrumentationProfile()) {
@@ -135,22 +142,10 @@ bool MachineFunctionSplitter::runOnMachineFunction(MachineFunction &MF) {
if (!UseProfileData && !SplitAllEHCode)
return false;
- // TODO: We don't split functions where a section attribute has been set
- // since the split part may not be placed in a contiguous region. It may also
- // be more beneficial to augment the linker to ensure contiguous layout of
- // split functions within the same section as specified by the attribute.
- if (MF.getFunction().hasSection() ||
- MF.getFunction().hasFnAttribute("implicit-section-name"))
+ const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
+ if (!TII.isFunctionSafeToSplit(MF))
return false;
- // We don't want to proceed further for cold functions
- // or functions of unknown hotness. Lukewarm functions have no prefix.
- std::optional<StringRef> SectionPrefix = MF.getFunction().getSectionPrefix();
- if (SectionPrefix &&
- (*SectionPrefix == "unlikely" || *SectionPrefix == "unknown")) {
- return false;
- }
-
// Renumbering blocks here preserves the order of the blocks as
// sortBasicBlocksAndUpdateBranches uses the numeric identifier to sort
// blocks. Preserving the order of blocks is essential to retaining decisions