patch-r252503-arm-transient-stack-alignment.diff revision 269012
1This patch applies a workaround for an ARM EABI issue, where clang would
2sometimes incorrectly align the stack in a leaf function that uses TLS.
3
4Introduced here: http://svnweb.freebsd.org/changeset/base/252503
5
6Index: test/CodeGen/Thumb2/large-stack.ll
7===================================================================
8--- test/CodeGen/Thumb2/large-stack.ll
9+++ test/CodeGen/Thumb2/large-stack.ll
10@@ -13,7 +13,7 @@ define void @test1() {
11 define void @test2() {
12 ; DARWIN-LABEL: test2:
13 ; DARWIN: sub.w sp, sp, #4160
14-; DARWIN: sub sp, #8
15+; DARWIN: sub sp, #12
16 ; LINUX-LABEL: test2:
17 ; LINUX: sub.w sp, sp, #4160
18 ; LINUX: sub sp, #8
19Index: test/CodeGen/ARM/2009-10-30.ll
20===================================================================
21--- test/CodeGen/ARM/2009-10-30.ll
22+++ test/CodeGen/ARM/2009-10-30.ll
23@@ -4,9 +4,10 @@
24 
25 define void @f(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, ...) {
26 entry:
27-;CHECK: sub	sp, sp, #4
28-;CHECK: add	r{{[0-9]+}}, sp, #8
29-;CHECK: str	r{{[0-9]+}}, [sp], #4
30+;CHECK: sub	sp, sp, #8
31+;CHECK: add	r{{[0-9]+}}, sp, #12
32+;CHECK: str	r{{[0-9]+}}, [sp, #4]
33+;CHECK: add	sp, sp, #8
34 ;CHECK: bx	lr
35 	%ap = alloca i8*, align 4
36 	%ap1 = bitcast i8** %ap to i8*
37Index: test/CodeGen/ARM/vargs_align.ll
38===================================================================
39--- test/CodeGen/ARM/vargs_align.ll
40+++ test/CodeGen/ARM/vargs_align.ll
41@@ -15,8 +15,8 @@ entry:
42 return:		; preds = %entry
43 	%retval2 = load i32* %retval		; <i32> [#uses=1]
44 	ret i32 %retval2
45-; EABI: add sp, sp, #12
46 ; EABI: add sp, sp, #16
47+; EABI: add sp, sp, #16
48+; OABI: add sp, sp, #16
49 ; OABI: add sp, sp, #12
50-; OABI: add sp, sp, #12
51 }
52Index: test/CodeGen/ARM/prefetch-thumb.ll
53===================================================================
54--- test/CodeGen/ARM/prefetch-thumb.ll
55+++ test/CodeGen/ARM/prefetch-thumb.ll
56@@ -10,8 +10,8 @@ entry:
57 ;ARM: pld [sp, #50]
58 
59 ;THUMB2: t6:
60-;THUMB2: pld [sp]
61-;THUMB2: pld [sp, #50]
62+;THUMB2: pld [sp, #4]
63+;THUMB2: pld [sp, #54]
64 
65 %red = alloca [100 x i8], align 1
66 %0 = getelementptr inbounds [100 x i8]* %red, i32 0, i32 0
67Index: lib/Target/ARM/ARMFrameLowering.h
68===================================================================
69--- lib/Target/ARM/ARMFrameLowering.h
70+++ lib/Target/ARM/ARMFrameLowering.h
71@@ -27,7 +27,7 @@ class ARMFrameLowering : public TargetFrameLowerin
72 
73 public:
74   explicit ARMFrameLowering(const ARMSubtarget &sti)
75-    : TargetFrameLowering(StackGrowsDown, sti.getStackAlignment(), 0, 4),
76+    : TargetFrameLowering(StackGrowsDown, sti.getStackAlignment(), 0, 8),
77       STI(sti) {
78   }
79 
80