From defcea1d1697572dda7c32e10163a5b9047808d1 Mon Sep 17 00:00:00 2001 From: Jessica Paquette Date: Wed, 4 Apr 2018 19:13:31 +0000 Subject: [PATCH] [MachineOutliner] Add `useMachineOutliner` target hook The MachineOutliner has a bunch of target hooks that will call llvm_unreachable if the target doesn't implement them. Therefore, if you enable the outliner on such a target, it'll just crash. It'd be much better if it'd just *not* run the outliner at all in this case. This commit adds a hook to TargetInstrInfo that returns false by default. Targets that implement the hook make it return true. The outliner checks the return value of this hook to decide whether or not to continue. llvm-svn: 329220 --- include/llvm/CodeGen/TargetInstrInfo.h | 3 +++ lib/CodeGen/MachineOutliner.cpp | 10 +++++++++- lib/Target/AArch64/AArch64InstrInfo.h | 3 +++ lib/Target/X86/X86InstrInfo.h | 3 +++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/include/llvm/CodeGen/TargetInstrInfo.h b/include/llvm/CodeGen/TargetInstrInfo.h index 481fe82754d..d6fc4482fc1 100644 --- a/include/llvm/CodeGen/TargetInstrInfo.h +++ b/include/llvm/CodeGen/TargetInstrInfo.h @@ -1574,6 +1574,9 @@ public: return false; } + /// Returns true if the target implements the MachineOutliner. + virtual bool useMachineOutliner() const { return false; } + /// \brief Describes the number of instructions that it will take to call and /// construct a frame for a given outlining candidate. struct MachineOutlinerInfo { diff --git a/lib/CodeGen/MachineOutliner.cpp b/lib/CodeGen/MachineOutliner.cpp index 2a6a94dc882..932316f1fd1 100644 --- a/lib/CodeGen/MachineOutliner.cpp +++ b/lib/CodeGen/MachineOutliner.cpp @@ -1416,7 +1416,15 @@ bool MachineOutliner::runOnModule(Module &M) { MMI.getOrCreateMachineFunction(*M.begin()).getSubtarget(); const TargetRegisterInfo *TRI = STI.getRegisterInfo(); const TargetInstrInfo *TII = STI.getInstrInfo(); - + + // Does the target implement the MachineOutliner? If it doesn't, quit here. + if (!TII->useMachineOutliner()) { + // No. So we're done. + DEBUG(dbgs() + << "Skipping pass: Target does not support the MachineOutliner.\n"); + return false; + } + InstructionMapper Mapper; // Build instruction mappings for each function in the module. Start by diff --git a/lib/Target/AArch64/AArch64InstrInfo.h b/lib/Target/AArch64/AArch64InstrInfo.h index bf0403d54c4..c517f970adc 100644 --- a/lib/Target/AArch64/AArch64InstrInfo.h +++ b/lib/Target/AArch64/AArch64InstrInfo.h @@ -236,6 +236,9 @@ public: ArrayRef> getSerializableMachineMemOperandTargetFlags() const override; + /// AArch64 supports the MachineOutliner. + bool useMachineOutliner() const override { return true; } + bool canOutlineWithoutLRSave(MachineBasicBlock::iterator &CallInsertionPt) const; bool isFunctionSafeToOutlineFrom(MachineFunction &MF, diff --git a/lib/Target/X86/X86InstrInfo.h b/lib/Target/X86/X86InstrInfo.h index 6eb0ac860ef..5b2799d049f 100644 --- a/lib/Target/X86/X86InstrInfo.h +++ b/lib/Target/X86/X86InstrInfo.h @@ -582,6 +582,9 @@ public: ArrayRef> getSerializableDirectMachineOperandTargetFlags() const override; + /// X86 supports the MachineOutliner. + bool useMachineOutliner() const override { return true; } + virtual MachineOutlinerInfo getOutlininingCandidateInfo( std::vector< std::pair>