[MachineOutliner] Ensure AArch64 outliner doesn't mess with W30 or LR

Before, the outliner would mark all instructions that read from/modify LR as
illegal. This doesn't handle W30, which overlaps with LR. This shouldn't be
outlined.

This commit fixes that by making modifiesRegister() and readsRegister() look at
W30 + take in a TRI argument. This makes sure that modifiesRegister() and
readsRegister() won't outline either of W30 and LR.

https://reviews.llvm.org/D36435

llvm-svn: 310422
This commit is contained in:
Jessica Paquette 2017-08-08 21:51:26 +00:00
parent bb9106ac4b
commit d36945bf3a
2 changed files with 88 additions and 6 deletions

View File

@ -4495,16 +4495,17 @@ AArch64InstrInfo::getOutliningType(MachineInstr &MI) const {
if (MI.isPosition())
return MachineOutlinerInstrType::Illegal;
// Don't touch the link register or W30.
if (MI.readsRegister(AArch64::W30, &getRegisterInfo()) ||
MI.modifiesRegister(AArch64::W30, &getRegisterInfo()))
return MachineOutlinerInstrType::Illegal;
// Make sure none of the operands are un-outlinable.
for (const MachineOperand &MOP : MI.operands())
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 (MI.modifiesRegister(AArch64::LR, &RI) ||
MI.readsRegister(AArch64::LR, &RI))
return MachineOutlinerInstrType::Illegal;
}
// Does this use the stack?
if (MI.modifiesRegister(AArch64::SP, &RI) ||

View File

@ -0,0 +1,81 @@
# RUN: llc -mtriple=aarch64--- -run-pass=machine-outliner %s -o - | FileCheck %s
--- |
target triple = "aarch64---"
define i32 @main() #0 {
entry:
ret i32 0
}
attributes #0 = { noinline noredzone nounwind optnone ssp uwtable }
# CHECK-LABEL: @OUTLINED_FUNCTION_0
...
---
# This test ensures that we
# - Create outlined functions
# - Don't outline anything to do with LR or W30
#
# CHECK-LABEL: name: main
# CHECK: BL @OUTLINED_FUNCTION_0
# CHECK: STRHHroW %w16, %x9, %w30, 1, 1
# CHECK: %lr = ORRXri %xzr, 1
# CHECK: BL @OUTLINED_FUNCTION_0
# CHECK: STRHHroW %w16, %x9, %w30, 1, 1
# CHECK: %lr = ORRXri %xzr, 1
# CHECK: BL @OUTLINED_FUNCTION_0
# CHECK: STRHHroW %w16, %x9, %w30, 1, 1
# CHECK: %lr = ORRXri %xzr, 1
name: main
alignment: 2
tracksRegLiveness: true
frameInfo:
stackSize: 16
maxAlignment: 4
maxCallFrameSize: 0
body: |
bb.0.entry:
%sp = frame-setup SUBXri %sp, 16, 0
%x9 = ORRXri %xzr, 1
%w16 = ORRWri %wzr, 1
%w30 = ORRWri %wzr, 1
%lr = ORRXri %xzr, 1
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
STRHHroW %w16, %x9, %w30, 1, 1
%lr = ORRXri %xzr, 1
%w3 = ORRWri %wzr, 1993
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
STRHHroW %w16, %x9, %w30, 1, 1
%lr = ORRXri %xzr, 1
%w4 = ORRWri %wzr, 1994
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
%w16 = ORRWri %wzr, 1
STRHHroW %w16, %x9, %w30, 1, 1
%lr = ORRXri %xzr, 1
%w5 = ORRWri %wzr, 1995
%sp = ADDXri %sp, 16, 0
RET undef %lr