From 2519ee70810c561ce40e5e4e57a9c083d30faf67 Mon Sep 17 00:00:00 2001 From: Jessica Paquette Date: Tue, 27 Mar 2018 22:23:48 +0000 Subject: [MachineOutliner] AArch64: Don't outline ADRPs with un-outlinable operands If an ADRP appears with, say, a CPI operand, we shouldn't outline it. This moves the check for unsafe operands so that it occurs before the special-case for ADRPs. Also add a test for outlining ADRPs. llvm-svn: 328674 --- llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) (limited to 'llvm/lib') diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp index 585524ebbf2..66950f50c82 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -5053,6 +5053,13 @@ AArch64InstrInfo::getOutliningType(MachineBasicBlock::iterator &MIT, return MachineOutlinerInstrType::Illegal; } + // Make sure none of the operands are un-outlinable. + for (const MachineOperand &MOP : MI.operands()) { + if (MOP.isCPI() || MOP.isJTI() || MOP.isCFIIndex() || MOP.isFI() || + MOP.isTargetIndex()) + return MachineOutlinerInstrType::Illegal; + } + // Special cases for instructions that can always be outlined, but will fail // the later tests. e.g, ADRPs, which are PC-relative use LR, but can always // be outlined because they don't require a *specific* value to be in LR. @@ -5132,17 +5139,6 @@ AArch64InstrInfo::getOutliningType(MachineBasicBlock::iterator &MIT, MI.modifiesRegister(AArch64::W30, &getRegisterInfo())) return MachineOutlinerInstrType::Illegal; - // Make sure none of the operands are un-outlinable. - for (const MachineOperand &MOP : MI.operands()) { - if (MOP.isCPI() || MOP.isJTI() || MOP.isCFIIndex() || MOP.isFI() || - MOP.isTargetIndex()) - return MachineOutlinerInstrType::Illegal; - - // Don't outline anything that uses the link register. - if (MOP.isReg() && getRegisterInfo().regsOverlap(MOP.getReg(), AArch64::LR)) - return MachineOutlinerInstrType::Illegal; - } - // Does this use the stack? if (MI.modifiesRegister(AArch64::SP, &RI) || MI.readsRegister(AArch64::SP, &RI)) { -- cgit v1.2.3