diff options
author | Jessica Paquette <jpaquette@apple.com> | 2018-03-27 22:23:48 +0000 |
---|---|---|
committer | Jessica Paquette <jpaquette@apple.com> | 2018-03-27 22:23:48 +0000 |
commit | 2519ee70810c561ce40e5e4e57a9c083d30faf67 (patch) | |
tree | 9b3715aeb7604695322e458d0f5a1251ad511df0 /llvm | |
parent | e4208bfa5b2d78541eeb08459caa11e850af201a (diff) | |
download | bcm5719-llvm-2519ee70810c561ce40e5e4e57a9c083d30faf67.tar.gz bcm5719-llvm-2519ee70810c561ce40e5e4e57a9c083d30faf67.zip |
[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
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 18 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/machine-outliner-bad-adrp.mir | 41 |
2 files changed, 48 insertions, 11 deletions
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)) { diff --git a/llvm/test/CodeGen/AArch64/machine-outliner-bad-adrp.mir b/llvm/test/CodeGen/AArch64/machine-outliner-bad-adrp.mir new file mode 100644 index 00000000000..4f783af0935 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/machine-outliner-bad-adrp.mir @@ -0,0 +1,41 @@ + +# RUN: llc -mtriple=aarch64--- -verify-machineinstrs -simplify-mir -run-pass=machine-outliner %s -o - | FileCheck %s +--- | + + define void @foo() #0 { + ret void + } + + attributes #0 = { noredzone } +... +--- +name: foo +constants: + - id: 0 + value: 'float 1.990000e+02' + alignment: 4 + isTargetSpecific: false +body: | + bb.0: + liveins: $w1, $w10, $x14, $x15, $x16, $x10, $lr + ; CHECK-NOT: BL + + $w10 = MOVZWi 4, 0, implicit-def $x10 + + renamable $x14 = ADRP target-flags(aarch64-page) %const.0 + renamable $x15 = ADRP target-flags(aarch64-page) %const.0 + renamable $x16 = ADRP target-flags(aarch64-page) %const.0 + + $w10 = MOVZWi 5, 0, implicit-def $x10 + + renamable $x14 = ADRP target-flags(aarch64-page) %const.0 + renamable $x15 = ADRP target-flags(aarch64-page) %const.0 + renamable $x16 = ADRP target-flags(aarch64-page) %const.0 + + $w10 = MOVZWi 6, 0, implicit-def $x10 + + renamable $x14 = ADRP target-flags(aarch64-page) %const.0 + renamable $x15 = ADRP target-flags(aarch64-page) %const.0 + renamable $x16 = ADRP target-flags(aarch64-page) %const.0 + + RET undef $lr |