[llvm] r348591 - ARM: use correct offset from base pointer (r6) in call frame regions.

Tim Northover via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 7 05:43:56 PST 2018


Author: tnorthover
Date: Fri Dec  7 05:43:55 2018
New Revision: 348591

URL: http://llvm.org/viewvc/llvm-project?rev=348591&view=rev
Log:
ARM: use correct offset from base pointer (r6) in call frame regions.

When we had dynamic call frames (i.e. sp adjustment around each call) we
were including that adjustment into offsets calculated based on r6, even
though it's only sp that changes. This led to incorrect stack slot
accesses.

Added:
    llvm/trunk/test/CodeGen/ARM/nonreserved-callframe-with-basereg.mir
Modified:
    llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp
    llvm/trunk/test/CodeGen/ARM/alloca-align.ll

Modified: llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp?rev=348591&r1=348590&r2=348591&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp Fri Dec  7 05:43:55 2018
@@ -911,6 +911,7 @@ ARMFrameLowering::ResolveFrameIndexRefer
       assert(RegInfo->hasBasePointer(MF) &&
              "VLAs and dynamic stack alignment, but missing base pointer!");
       FrameReg = RegInfo->getBaseRegister();
+      Offset -= SPAdj;
     }
     return Offset;
   }

Modified: llvm/trunk/test/CodeGen/ARM/alloca-align.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/alloca-align.ll?rev=348591&r1=348590&r2=348591&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/alloca-align.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/alloca-align.ll Fri Dec  7 05:43:55 2018
@@ -12,8 +12,7 @@ declare void @bar(i32*, [20000 x i8]* by
 ; And a base pointer getting used.
 ; CHECK: mov r6, sp
 ; Which is passed to the call
-; CHECK: add [[REG:r[0-9]+|lr]], r6, #19456
-; CHECK: add r0, [[REG]], #536
+; CHECK: mov r0, r6
 ; CHECK: bl bar
 define void @foo([20000 x i8]* %addr) {
   %tmp = alloca [4 x i32], align 32

Added: llvm/trunk/test/CodeGen/ARM/nonreserved-callframe-with-basereg.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/nonreserved-callframe-with-basereg.mir?rev=348591&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/nonreserved-callframe-with-basereg.mir (added)
+++ llvm/trunk/test/CodeGen/ARM/nonreserved-callframe-with-basereg.mir Fri Dec  7 05:43:55 2018
@@ -0,0 +1,54 @@
+# RUN: llc -run-pass=prologepilog %s -o -  | FileCheck %s
+
+# Make sure we use the correct offset for stack accesses using the base pointer
+# within call frame blocks. Key points of test:
+#    + A large SP in ADJCALLSTACKDOWN forces each call to get its own adjustment.
+#    + An over-aligned stack variable means that we must use r6 rather than fp
+#      to access this variables.
+#
+# Under these circumstances, the ADJCALLSTACKDOWN must not apply to r6 offsets.
+
+--- |
+  ; ModuleID = 'simple.ll'
+  source_filename = "simple.ll"
+  target datalayout = "e-m:o-p:32:32-i64:64-a:0:32-n32-S128"
+  target triple = "thumbv7k-apple-ios"
+
+  declare void @bar([4 x i32], i32)
+
+  define void @foo(i32 %n) {
+    ret void
+  }
+
+...
+---
+name:            foo
+liveins:
+  - { reg: '$r0', virtual-reg: '' }
+frameInfo:
+  adjustsStack:    true
+  hasCalls:        true
+  maxCallFrameSize: 2276
+stack:
+  - { id: 0, name: '', type: spill-slot, offset: 0, alignment: 32,  size: 4 }
+constants:       []
+body:             |
+  bb.0 (%ir-block.0):
+    liveins: $r0
+
+    ; CHECK: t2STRi12 killed $r0, $r6, [[OFFSET:[0-9]+]]
+    t2STRi12 killed $r0, %stack.0, 0, 14, $noreg :: (store 4 into %stack.0)
+
+    ADJCALLSTACKDOWN 2276, 0, 14, $noreg, implicit-def dead $sp, implicit $sp
+
+    ; CHECK: renamable $r0 = t2LDRi12 $r6, [[OFFSET]]
+    renamable $r0 = t2LDRi12 %stack.0, 0, 14, $noreg, :: (load 4 from %stack.0)
+    renamable $r1 = IMPLICIT_DEF
+    renamable $r2 = IMPLICIT_DEF
+    renamable $r3 = IMPLICIT_DEF
+    tBL 14, $noreg, @bar, csr_ios, implicit-def dead $lr, implicit $sp, implicit killed $r0, implicit killed $r1, implicit killed $r2, implicit killed $r3, implicit-def $sp
+
+    ADJCALLSTACKUP 2276, 0, 14, $noreg, implicit-def dead $sp, implicit $sp
+    tBX_RET 14, $noreg
+
+...




More information about the llvm-commits mailing list