xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/thumb1-varalloc.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv6-apple-darwin | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv6-apple-darwin -regalloc=basic | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -o %t -filetype=obj -mtriple=thumbv6-apple-darwin
4*9880d681SAndroid Build Coastguard Worker; RUN: llvm-objdump -triple=thumbv6-apple-darwin -d %t | FileCheck %s
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker@__bar = external hidden global i8*
7*9880d681SAndroid Build Coastguard Worker@__baz = external hidden global i8*
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; rdar://8819685
10*9880d681SAndroid Build Coastguard Workerdefine i8* @_foo() {
11*9880d681SAndroid Build Coastguard Workerentry:
12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo:
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker	%size = alloca i32, align 4
15*9880d681SAndroid Build Coastguard Worker	%0 = load i8*, i8** @__bar, align 4
16*9880d681SAndroid Build Coastguard Worker	%1 = icmp eq i8* %0, null
17*9880d681SAndroid Build Coastguard Worker	br i1 %1, label %bb1, label %bb3
18*9880d681SAndroid Build Coastguard Worker; CHECK: bne
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerbb1:
21*9880d681SAndroid Build Coastguard Worker	store i32 1026, i32* %size, align 4
22*9880d681SAndroid Build Coastguard Worker	%2 = alloca [1026 x i8], align 1
23*9880d681SAndroid Build Coastguard Worker; CHECK: mov     [[R0:r[0-9]+]], sp
24*9880d681SAndroid Build Coastguard Worker; CHECK: adds    {{r[0-9]+}}, [[R0]], {{r[0-9]+}}
25*9880d681SAndroid Build Coastguard Worker	%3 = getelementptr inbounds [1026 x i8], [1026 x i8]* %2, i32 0, i32 0
26*9880d681SAndroid Build Coastguard Worker	%4 = call i32 @_called_func(i8* %3, i32* %size) nounwind
27*9880d681SAndroid Build Coastguard Worker	%5 = icmp eq i32 %4, 0
28*9880d681SAndroid Build Coastguard Worker	br i1 %5, label %bb2, label %bb3
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerbb2:
31*9880d681SAndroid Build Coastguard Worker	%6 = call i8* @strdup(i8* %3) nounwind
32*9880d681SAndroid Build Coastguard Worker	store i8* %6, i8** @__baz, align 4
33*9880d681SAndroid Build Coastguard Worker	br label %bb3
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerbb3:
36*9880d681SAndroid Build Coastguard Worker	%.0 = phi i8* [ %0, %entry ], [ %6, %bb2 ], [ %3, %bb1 ]
37*9880d681SAndroid Build Coastguard Worker; CHECK: subs    r4, #5
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov     sp, r4
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pop     {r4, r5, r6, r7, pc}
40*9880d681SAndroid Build Coastguard Worker	ret i8* %.0
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @strdup(i8* nocapture) nounwind
44*9880d681SAndroid Build Coastguard Workerdeclare i32 @_called_func(i8*, i32*) nounwind
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker; Simple variable ending up *at* sp.
47*9880d681SAndroid Build Coastguard Workerdefine void @test_simple_var() {
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_simple_var:
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker  %addr32 = alloca i32
51*9880d681SAndroid Build Coastguard Worker  %addr8 = bitcast i32* %addr32 to i8*
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker; CHECK: mov r0, sp
54*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: adds r0
55*9880d681SAndroid Build Coastguard Worker; CHECK: bl
56*9880d681SAndroid Build Coastguard Worker  call void @take_ptr(i8* %addr8)
57*9880d681SAndroid Build Coastguard Worker  ret void
58*9880d681SAndroid Build Coastguard Worker}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker; Simple variable ending up at aligned offset from sp.
61*9880d681SAndroid Build Coastguard Workerdefine void @test_local_var_addr_aligned() {
62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_local_var_addr_aligned:
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker  %addr1.32 = alloca i32
65*9880d681SAndroid Build Coastguard Worker  %addr1 = bitcast i32* %addr1.32 to i8*
66*9880d681SAndroid Build Coastguard Worker  %addr2.32 = alloca i32
67*9880d681SAndroid Build Coastguard Worker  %addr2 = bitcast i32* %addr2.32 to i8*
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker; CHECK: add r0, sp, #{{[0-9]+}}
70*9880d681SAndroid Build Coastguard Worker; CHECK: bl
71*9880d681SAndroid Build Coastguard Worker  call void @take_ptr(i8* %addr1)
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; CHECK: mov r0, sp
74*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add r0
75*9880d681SAndroid Build Coastguard Worker; CHECK: bl
76*9880d681SAndroid Build Coastguard Worker  call void @take_ptr(i8* %addr2)
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker  ret void
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker; Simple variable ending up at aligned offset from sp.
82*9880d681SAndroid Build Coastguard Workerdefine void @test_local_var_big_offset() {
83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_local_var_big_offset:
84*9880d681SAndroid Build Coastguard Worker  %addr1.32 = alloca i32, i32 257
85*9880d681SAndroid Build Coastguard Worker  %addr1 = bitcast i32* %addr1.32 to i8*
86*9880d681SAndroid Build Coastguard Worker  %addr2.32 = alloca i32, i32 257
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; CHECK: add [[RTMP:r[0-9]+]], sp, #1020
89*9880d681SAndroid Build Coastguard Worker; CHECK: adds [[RTMP]], #8
90*9880d681SAndroid Build Coastguard Worker; CHECK: bl
91*9880d681SAndroid Build Coastguard Worker  call void @take_ptr(i8* %addr1)
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker  ret void
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; Max range addressable with tADDrSPi
97*9880d681SAndroid Build Coastguard Workerdefine void @test_local_var_offset_1020() {
98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_local_var_offset_1020
99*9880d681SAndroid Build Coastguard Worker  %addr1 = alloca i8, i32 4
100*9880d681SAndroid Build Coastguard Worker  %addr2 = alloca i8, i32 1020
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker; CHECK: add r0, sp, #1020
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl
104*9880d681SAndroid Build Coastguard Worker  call void @take_ptr(i8* %addr1)
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker  ret void
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker; Max range addressable with tADDrSPi + tADDi8 is 1275, however the automatic
110*9880d681SAndroid Build Coastguard Worker; 4-byte aligning of objects on the stack combined with 8-byte stack alignment
111*9880d681SAndroid Build Coastguard Worker; means that 1268 is the max offset we can use.
112*9880d681SAndroid Build Coastguard Workerdefine void @test_local_var_offset_1268() {
113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_local_var_offset_1268
114*9880d681SAndroid Build Coastguard Worker  %addr1 = alloca i8, i32 1
115*9880d681SAndroid Build Coastguard Worker  %addr2 = alloca i8, i32 1268
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker; CHECK: add r0, sp, #1020
118*9880d681SAndroid Build Coastguard Worker; CHECK: adds r0, #248
119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl
120*9880d681SAndroid Build Coastguard Worker  call void @take_ptr(i8* %addr1)
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker  ret void
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdeclare void @take_ptr(i8*)
126