mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 02:52:53 +02:00
[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:
parent
6484ea55e4
commit
ea7e8d0aaa
@ -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) ||
|
||||
|
81
test/CodeGen/AArch64/machine-outliner.mir
Normal file
81
test/CodeGen/AArch64/machine-outliner.mir
Normal 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
|
||||
|
Loading…
Reference in New Issue
Block a user