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

Jessica Paquette via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 8 14:51:27 PDT 2017


Author: paquette
Date: Tue Aug  8 14:51:26 2017
New Revision: 310422

URL: http://llvm.org/viewvc/llvm-project?rev=310422&view=rev
Log:
[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


Added:
    llvm/trunk/test/CodeGen/AArch64/machine-outliner.mir
Modified:
    llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp

Modified: llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp?rev=310422&r1=310421&r2=310422&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp (original)
+++ llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp Tue Aug  8 14:51:26 2017
@@ -4495,16 +4495,17 @@ AArch64InstrInfo::getOutliningType(Machi
   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) ||

Added: llvm/trunk/test/CodeGen/AArch64/machine-outliner.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/machine-outliner.mir?rev=310422&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/machine-outliner.mir (added)
+++ llvm/trunk/test/CodeGen/AArch64/machine-outliner.mir Tue Aug  8 14:51:26 2017
@@ -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




More information about the llvm-commits mailing list