]> granicus.if.org Git - llvm/commitdiff
[MachineOutliner] Ensure AArch64 outliner doesn't mess with W30 or LR
authorJessica Paquette <jpaquette@apple.com>
Tue, 8 Aug 2017 21:51:26 +0000 (21:51 +0000)
committerJessica Paquette <jpaquette@apple.com>
Tue, 8 Aug 2017 21:51:26 +0000 (21:51 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@310422 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AArch64/AArch64InstrInfo.cpp
test/CodeGen/AArch64/machine-outliner.mir [new file with mode: 0644]

index 8656b125fddafe3637c2fd7a0afc50dcb4c49501..4a68dff9d6efa7a022989336eab3fae5acb54c08 100644 (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) ||
diff --git a/test/CodeGen/AArch64/machine-outliner.mir b/test/CodeGen/AArch64/machine-outliner.mir
new file mode 100644 (file)
index 0000000..822ceb2
--- /dev/null
@@ -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