From d36945bf3a67fabfb5e28726deaede4295dcc574 Mon Sep 17 00:00:00 2001 From: Jessica Paquette Date: Tue, 8 Aug 2017 21:51:26 +0000 Subject: [PATCH] [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 --- llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 13 +++-- llvm/test/CodeGen/AArch64/machine-outliner.mir | 81 ++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 llvm/test/CodeGen/AArch64/machine-outliner.mir diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp index 8656b12..4a68dff 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -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) || diff --git a/llvm/test/CodeGen/AArch64/machine-outliner.mir b/llvm/test/CodeGen/AArch64/machine-outliner.mir new file mode 100644 index 0000000..822ceb2 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/machine-outliner.mir @@ -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 + \ No newline at end of file -- 2.7.4