mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +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())
|
if (MI.isPosition())
|
||||||
return MachineOutlinerInstrType::Illegal;
|
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.
|
// 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() ||
|
if (MOP.isCPI() || MOP.isJTI() || MOP.isCFIIndex() || MOP.isFI() ||
|
||||||
MOP.isTargetIndex())
|
MOP.isTargetIndex())
|
||||||
return MachineOutlinerInstrType::Illegal;
|
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?
|
// Does this use the stack?
|
||||||
if (MI.modifiesRegister(AArch64::SP, &RI) ||
|
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