xref: /llvm-project/llvm/test/CodeGen/PowerPC/frameaddr.ll (revision 3453dedfaf565429bc06c6d58533926f793ad650)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc -mtriple=powerpc-ibm-aix-xcoff -verify-machineinstrs < %s -mcpu=pwr7 | FileCheck %s --check-prefix=AIX32
3; RUN: llc -mtriple=powerpc64-ibm-aix-xcoff -verify-machineinstrs < %s -mcpu=pwr7 | FileCheck %s --check-prefix=AIX64
4; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs < %s -mcpu=pwr7 | FileCheck %s --check-prefix=LE
5
6define ptr @main() #0 {
7; AIX32-LABEL: main:
8; AIX32:       # %bb.0: # %entry
9; AIX32-NEXT:    stwu 1, -32(1)
10; AIX32-NEXT:    mr 3, 1
11; AIX32-NEXT:    addi 1, 1, 32
12; AIX32-NEXT:    blr
13;
14; AIX64-LABEL: main:
15; AIX64:       # %bb.0: # %entry
16; AIX64-NEXT:    stdu 1, -48(1)
17; AIX64-NEXT:    mr 3, 1
18; AIX64-NEXT:    addi 1, 1, 48
19; AIX64-NEXT:    blr
20;
21; LE-LABEL: main:
22; LE:       # %bb.0: # %entry
23; LE-NEXT:    stdu 1, -32(1)
24; LE-NEXT:    mr 3, 1
25; LE-NEXT:    addi 1, 1, 32
26; LE-NEXT:    blr
27entry:
28  %0 = call ptr @llvm.frameaddress(i32 0)
29  ret ptr %0
30}
31
32define ptr @foo_naked() #3 { ; naked
33; AIX32-LABEL: foo_naked:
34; AIX32:       # %bb.0: # %entry
35; AIX32-NEXT:    lwz 3, 0(1)
36; AIX32-NEXT:    blr
37;
38; AIX64-LABEL: foo_naked:
39; AIX64:       # %bb.0: # %entry
40; AIX64-NEXT:    ld 3, 0(1)
41; AIX64-NEXT:    blr
42;
43; LE-LABEL: foo_naked:
44; LE:       # %bb.0: # %entry
45; LE-NEXT:    ld 3, 0(1)
46; LE-NEXT:    blr
47entry:
48  %0 = call ptr @llvm.frameaddress(i32 1)
49  ret ptr %0
50}
51
52define ptr @foo1() #0 {
53; AIX32-LABEL: foo1:
54; AIX32:       # %bb.0: # %entry
55; AIX32-NEXT:    stwu 1, -32(1)
56; AIX32-NEXT:    lwz 3, 0(1)
57; AIX32-NEXT:    addi 1, 1, 32
58; AIX32-NEXT:    blr
59;
60; AIX64-LABEL: foo1:
61; AIX64:       # %bb.0: # %entry
62; AIX64-NEXT:    stdu 1, -48(1)
63; AIX64-NEXT:    ld 3, 0(1)
64; AIX64-NEXT:    addi 1, 1, 48
65; AIX64-NEXT:    blr
66;
67; LE-LABEL: foo1:
68; LE:       # %bb.0: # %entry
69; LE-NEXT:    stdu 1, -32(1)
70; LE-NEXT:    ld 3, 0(1)
71; LE-NEXT:    addi 1, 1, 32
72; LE-NEXT:    blr
73entry:
74  %0 = call ptr @llvm.frameaddress(i32 1)
75  ret ptr %0
76}
77
78define ptr @foo2() #0 {
79; AIX32-LABEL: foo2:
80; AIX32:       # %bb.0: # %entry
81; AIX32-NEXT:    stwu 1, -32(1)
82; AIX32-NEXT:    lwz 3, 0(1)
83; AIX32-NEXT:    lwz 3, 0(3)
84; AIX32-NEXT:    addi 1, 1, 32
85; AIX32-NEXT:    blr
86;
87; AIX64-LABEL: foo2:
88; AIX64:       # %bb.0: # %entry
89; AIX64-NEXT:    stdu 1, -48(1)
90; AIX64-NEXT:    ld 3, 0(1)
91; AIX64-NEXT:    ld 3, 0(3)
92; AIX64-NEXT:    addi 1, 1, 48
93; AIX64-NEXT:    blr
94;
95; LE-LABEL: foo2:
96; LE:       # %bb.0: # %entry
97; LE-NEXT:    stdu 1, -32(1)
98; LE-NEXT:    ld 3, 0(1)
99; LE-NEXT:    ld 3, 0(3)
100; LE-NEXT:    addi 1, 1, 32
101; LE-NEXT:    blr
102entry:
103  %0 = call ptr @llvm.frameaddress(i32 2)
104  ret ptr %0
105}
106
107define ptr @bar0() #0 {
108; AIX32-LABEL: bar0:
109; AIX32:       # %bb.0: # %entry
110; AIX32-NEXT:    mflr 0
111; AIX32-NEXT:    stw 31, -4(1)
112; AIX32-NEXT:    stw 0, 8(1)
113; AIX32-NEXT:    lis 0, -2
114; AIX32-NEXT:    ori 0, 0, 31008
115; AIX32-NEXT:    stwux 1, 1, 0
116; AIX32-NEXT:    mr 31, 1
117; AIX32-NEXT:    addi 3, 31, 60
118; AIX32-NEXT:    bl .use[PR]
119; AIX32-NEXT:    nop
120; AIX32-NEXT:    mr 3, 31
121; AIX32-NEXT:    lwz 1, 0(1)
122; AIX32-NEXT:    lwz 0, 8(1)
123; AIX32-NEXT:    lwz 31, -4(1)
124; AIX32-NEXT:    mtlr 0
125; AIX32-NEXT:    blr
126;
127; AIX64-LABEL: bar0:
128; AIX64:       # %bb.0: # %entry
129; AIX64-NEXT:    mflr 0
130; AIX64-NEXT:    std 31, -8(1)
131; AIX64-NEXT:    std 0, 16(1)
132; AIX64-NEXT:    lis 0, -2
133; AIX64-NEXT:    ori 0, 0, 30944
134; AIX64-NEXT:    stdux 1, 1, 0
135; AIX64-NEXT:    mr 31, 1
136; AIX64-NEXT:    addi 3, 31, 120
137; AIX64-NEXT:    bl .use[PR]
138; AIX64-NEXT:    nop
139; AIX64-NEXT:    mr 3, 31
140; AIX64-NEXT:    ld 1, 0(1)
141; AIX64-NEXT:    ld 0, 16(1)
142; AIX64-NEXT:    ld 31, -8(1)
143; AIX64-NEXT:    mtlr 0
144; AIX64-NEXT:    blr
145;
146; LE-LABEL: bar0:
147; LE:       # %bb.0: # %entry
148; LE-NEXT:    mflr 0
149; LE-NEXT:    std 31, -8(1)
150; LE-NEXT:    std 0, 16(1)
151; LE-NEXT:    lis 0, -2
152; LE-NEXT:    ori 0, 0, 31024
153; LE-NEXT:    stdux 1, 1, 0
154; LE-NEXT:    mr 31, 1
155; LE-NEXT:    addi 3, 31, 40
156; LE-NEXT:    bl use
157; LE-NEXT:    nop
158; LE-NEXT:    mr 3, 31
159; LE-NEXT:    ld 1, 0(1)
160; LE-NEXT:    ld 0, 16(1)
161; LE-NEXT:    ld 31, -8(1)
162; LE-NEXT:    mtlr 0
163; LE-NEXT:    blr
164entry:
165  %x = alloca [100000 x i8]                       ; <ptr> [#uses=1]
166  call void @use(ptr %x) nounwind
167  %0 = call ptr @llvm.frameaddress(i32 0)
168  ret ptr %0
169}
170
171define ptr @bar1() #0 {
172; AIX32-LABEL: bar1:
173; AIX32:       # %bb.0: # %entry
174; AIX32-NEXT:    mflr 0
175; AIX32-NEXT:    stw 31, -4(1)
176; AIX32-NEXT:    stw 0, 8(1)
177; AIX32-NEXT:    lis 0, -2
178; AIX32-NEXT:    ori 0, 0, 31008
179; AIX32-NEXT:    stwux 1, 1, 0
180; AIX32-NEXT:    mr 31, 1
181; AIX32-NEXT:    addi 3, 31, 60
182; AIX32-NEXT:    bl .use[PR]
183; AIX32-NEXT:    nop
184; AIX32-NEXT:    lwz 3, 0(31)
185; AIX32-NEXT:    lwz 1, 0(1)
186; AIX32-NEXT:    lwz 0, 8(1)
187; AIX32-NEXT:    lwz 31, -4(1)
188; AIX32-NEXT:    mtlr 0
189; AIX32-NEXT:    blr
190;
191; AIX64-LABEL: bar1:
192; AIX64:       # %bb.0: # %entry
193; AIX64-NEXT:    mflr 0
194; AIX64-NEXT:    std 31, -8(1)
195; AIX64-NEXT:    std 0, 16(1)
196; AIX64-NEXT:    lis 0, -2
197; AIX64-NEXT:    ori 0, 0, 30944
198; AIX64-NEXT:    stdux 1, 1, 0
199; AIX64-NEXT:    mr 31, 1
200; AIX64-NEXT:    addi 3, 31, 120
201; AIX64-NEXT:    bl .use[PR]
202; AIX64-NEXT:    nop
203; AIX64-NEXT:    ld 3, 0(31)
204; AIX64-NEXT:    ld 1, 0(1)
205; AIX64-NEXT:    ld 0, 16(1)
206; AIX64-NEXT:    ld 31, -8(1)
207; AIX64-NEXT:    mtlr 0
208; AIX64-NEXT:    blr
209;
210; LE-LABEL: bar1:
211; LE:       # %bb.0: # %entry
212; LE-NEXT:    mflr 0
213; LE-NEXT:    std 31, -8(1)
214; LE-NEXT:    std 0, 16(1)
215; LE-NEXT:    lis 0, -2
216; LE-NEXT:    ori 0, 0, 31024
217; LE-NEXT:    stdux 1, 1, 0
218; LE-NEXT:    mr 31, 1
219; LE-NEXT:    addi 3, 31, 40
220; LE-NEXT:    bl use
221; LE-NEXT:    nop
222; LE-NEXT:    ld 3, 0(31)
223; LE-NEXT:    ld 1, 0(1)
224; LE-NEXT:    ld 0, 16(1)
225; LE-NEXT:    ld 31, -8(1)
226; LE-NEXT:    mtlr 0
227; LE-NEXT:    blr
228entry:
229  %x = alloca [100000 x i8]                       ; <ptr> [#uses=1]
230  call void @use(ptr %x) nounwind
231  %0 = call ptr @llvm.frameaddress(i32 1)
232  ret ptr %0
233}
234
235declare void @use(ptr)
236
237declare ptr @llvm.frameaddress(i32) #2
238
239attributes #0 = { nounwind "less-precise-fpmad"="false" "frame-pointer"="non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
240attributes #1 = { noreturn nounwind }
241attributes #2 = { nounwind readnone }
242attributes #3 = { nounwind naked "less-precise-fpmad"="false" "frame-pointer"="non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
243