xref: /llvm-project/llvm/test/CodeGen/PowerPC/ppc64-inlineasm-clobber.ll (revision eb7d16ea25649909373e324e6ebf36774cabdbfa)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=powerpc64le-unknown-linux-unknown -verify-machineinstrs %s \
3; RUN: -ppc-asm-full-reg-names -o - | FileCheck %s --check-prefix=PPC64LE
4; RUN: llc -mtriple=powerpc64-unknown-linux-unknown -verify-machineinstrs %s \
5; RUN: -ppc-asm-full-reg-names -o - | FileCheck %s --check-prefix=PPC64BE
6
7define dso_local void @ClobberLR() local_unnamed_addr #0 {
8; PPC64LE-LABEL: ClobberLR:
9; PPC64LE:       # %bb.0: # %entry
10; PPC64LE-NEXT:    mflr r0
11; PPC64LE-NEXT:    stdu r1, -32(r1)
12; PPC64LE-NEXT:    std r0, 48(r1)
13; PPC64LE-NEXT:    #APP
14; PPC64LE-NEXT:    #NO_APP
15; PPC64LE-NEXT:    addi r1, r1, 32
16; PPC64LE-NEXT:    ld r0, 16(r1)
17; PPC64LE-NEXT:    mtlr r0
18; PPC64LE-NEXT:    blr
19;
20; PPC64BE-LABEL: ClobberLR:
21; PPC64BE:       # %bb.0: # %entry
22; PPC64BE-NEXT:    mflr r0
23; PPC64BE-NEXT:    stdu r1, -48(r1)
24; PPC64BE-NEXT:    std r0, 64(r1)
25; PPC64BE-NEXT:    #APP
26; PPC64BE-NEXT:    #NO_APP
27; PPC64BE-NEXT:    addi r1, r1, 48
28; PPC64BE-NEXT:    ld r0, 16(r1)
29; PPC64BE-NEXT:    mtlr r0
30; PPC64BE-NEXT:    blr
31entry:
32  tail call void asm sideeffect "", "~{lr}"()
33  ret void
34}
35
36define dso_local void @ClobberR5() local_unnamed_addr #0 {
37; PPC64LE-LABEL: ClobberR5:
38; PPC64LE:       # %bb.0: # %entry
39; PPC64LE-NEXT:    #APP
40; PPC64LE-NEXT:    #NO_APP
41; PPC64LE-NEXT:    blr
42;
43; PPC64BE-LABEL: ClobberR5:
44; PPC64BE:       # %bb.0: # %entry
45; PPC64BE-NEXT:    #APP
46; PPC64BE-NEXT:    #NO_APP
47; PPC64BE-NEXT:    blr
48entry:
49  tail call void asm sideeffect "", "~{r5}"()
50  ret void
51}
52
53define dso_local void @ClobberR15() local_unnamed_addr #0 {
54; PPC64LE-LABEL: ClobberR15:
55; PPC64LE:       # %bb.0: # %entry
56; PPC64LE-NEXT:    std r15, -136(r1) # 8-byte Folded Spill
57; PPC64LE-NEXT:    #APP
58; PPC64LE-NEXT:    #NO_APP
59; PPC64LE-NEXT:    ld r15, -136(r1) # 8-byte Folded Reload
60; PPC64LE-NEXT:    blr
61;
62; PPC64BE-LABEL: ClobberR15:
63; PPC64BE:       # %bb.0: # %entry
64; PPC64BE-NEXT:    std r15, -136(r1) # 8-byte Folded Spill
65; PPC64BE-NEXT:    #APP
66; PPC64BE-NEXT:    #NO_APP
67; PPC64BE-NEXT:    ld r15, -136(r1) # 8-byte Folded Reload
68; PPC64BE-NEXT:    blr
69entry:
70  tail call void asm sideeffect "", "~{r15}"()
71  ret void
72}
73
74;; Test for INLINEASM_BR
75define dso_local signext i32 @ClobberLR_BR(i32 signext %in) #0 {
76; PPC64LE-LABEL: ClobberLR_BR:
77; PPC64LE:       # %bb.0: # %entry
78; PPC64LE-NEXT:    mflr r0
79; PPC64LE-NEXT:    stdu r1, -32(r1)
80; PPC64LE-NEXT:    std r0, 48(r1)
81; PPC64LE-NEXT:    #APP
82; PPC64LE-NEXT:    nop
83; PPC64LE-NEXT:    #NO_APP
84; PPC64LE-NEXT:  .LBB3_1: # %return
85; PPC64LE-NEXT:    addi r1, r1, 32
86; PPC64LE-NEXT:    ld r0, 16(r1)
87; PPC64LE-NEXT:    mtlr r0
88; PPC64LE-NEXT:    blr
89; PPC64LE-NEXT:  .LBB3_2: # Block address taken
90; PPC64LE-NEXT:    # %return_early
91; PPC64LE-NEXT:    # Label of block must be emitted
92; PPC64LE-NEXT:    li r3, 0
93; PPC64LE-NEXT:    b .LBB3_1
94;
95; PPC64BE-LABEL: ClobberLR_BR:
96; PPC64BE:       # %bb.0: # %entry
97; PPC64BE-NEXT:    mflr r0
98; PPC64BE-NEXT:    stdu r1, -48(r1)
99; PPC64BE-NEXT:    std r0, 64(r1)
100; PPC64BE-NEXT:    #APP
101; PPC64BE-NEXT:    nop
102; PPC64BE-NEXT:    #NO_APP
103; PPC64BE-NEXT:  .LBB3_1: # %return
104; PPC64BE-NEXT:    addi r1, r1, 48
105; PPC64BE-NEXT:    ld r0, 16(r1)
106; PPC64BE-NEXT:    mtlr r0
107; PPC64BE-NEXT:    blr
108; PPC64BE-NEXT:  .LBB3_2: # Block address taken
109; PPC64BE-NEXT:    # %return_early
110; PPC64BE-NEXT:    # Label of block must be emitted
111; PPC64BE-NEXT:    li r3, 0
112; PPC64BE-NEXT:    b .LBB3_1
113entry:
114  callbr void asm sideeffect "nop", "!i,~{lr}"()
115          to label %return [label %return_early]
116
117return_early:
118  br label %return
119
120return:
121  %retval.0 = phi i32 [ 0, %return_early ], [ %in, %entry ]
122  ret i32 %retval.0
123}
124
125define dso_local signext i32 @ClobberR5_BR(i32 signext %in) #0 {
126; PPC64LE-LABEL: ClobberR5_BR:
127; PPC64LE:       # %bb.0: # %entry
128; PPC64LE-NEXT:    #APP
129; PPC64LE-NEXT:    nop
130; PPC64LE-NEXT:    #NO_APP
131; PPC64LE-NEXT:  # %bb.1: # %return
132; PPC64LE-NEXT:    blr
133; PPC64LE-NEXT:  .LBB4_2: # Block address taken
134; PPC64LE-NEXT:    # %return_early
135; PPC64LE-NEXT:    # Label of block must be emitted
136; PPC64LE-NEXT:    li r3, 0
137; PPC64LE-NEXT:    blr
138;
139; PPC64BE-LABEL: ClobberR5_BR:
140; PPC64BE:       # %bb.0: # %entry
141; PPC64BE-NEXT:    #APP
142; PPC64BE-NEXT:    nop
143; PPC64BE-NEXT:    #NO_APP
144; PPC64BE-NEXT:  # %bb.1: # %return
145; PPC64BE-NEXT:    blr
146; PPC64BE-NEXT:  .LBB4_2: # Block address taken
147; PPC64BE-NEXT:    # %return_early
148; PPC64BE-NEXT:    # Label of block must be emitted
149; PPC64BE-NEXT:    li r3, 0
150; PPC64BE-NEXT:    blr
151entry:
152  callbr void asm sideeffect "nop", "!i,~{r5}"()
153          to label %return [label %return_early]
154
155return_early:
156  br label %return
157
158return:
159  %retval.0 = phi i32 [ 0, %return_early ], [ %in, %entry ]
160  ret i32 %retval.0
161}
162
163
164
165define dso_local void @DefLR() local_unnamed_addr #0 {
166; PPC64LE-LABEL: DefLR:
167; PPC64LE:       # %bb.0: # %entry
168; PPC64LE-NEXT:    mflr r0
169; PPC64LE-NEXT:    stdu r1, -32(r1)
170; PPC64LE-NEXT:    std r0, 48(r1)
171; PPC64LE-NEXT:    #APP
172; PPC64LE-NEXT:    #NO_APP
173; PPC64LE-NEXT:    addi r1, r1, 32
174; PPC64LE-NEXT:    ld r0, 16(r1)
175; PPC64LE-NEXT:    mtlr r0
176; PPC64LE-NEXT:    blr
177;
178; PPC64BE-LABEL: DefLR:
179; PPC64BE:       # %bb.0: # %entry
180; PPC64BE-NEXT:    mflr r0
181; PPC64BE-NEXT:    stdu r1, -48(r1)
182; PPC64BE-NEXT:    std r0, 64(r1)
183; PPC64BE-NEXT:    #APP
184; PPC64BE-NEXT:    #NO_APP
185; PPC64BE-NEXT:    addi r1, r1, 48
186; PPC64BE-NEXT:    ld r0, 16(r1)
187; PPC64BE-NEXT:    mtlr r0
188; PPC64BE-NEXT:    blr
189entry:
190  tail call i64 asm sideeffect "", "={lr}"()
191  ret void
192}
193
194define dso_local void @EarlyClobberLR() local_unnamed_addr #0 {
195; PPC64LE-LABEL: EarlyClobberLR:
196; PPC64LE:       # %bb.0: # %entry
197; PPC64LE-NEXT:    mflr r0
198; PPC64LE-NEXT:    stdu r1, -32(r1)
199; PPC64LE-NEXT:    std r0, 48(r1)
200; PPC64LE-NEXT:    #APP
201; PPC64LE-NEXT:    #NO_APP
202; PPC64LE-NEXT:    addi r1, r1, 32
203; PPC64LE-NEXT:    ld r0, 16(r1)
204; PPC64LE-NEXT:    mtlr r0
205; PPC64LE-NEXT:    blr
206;
207; PPC64BE-LABEL: EarlyClobberLR:
208; PPC64BE:       # %bb.0: # %entry
209; PPC64BE-NEXT:    mflr r0
210; PPC64BE-NEXT:    stdu r1, -48(r1)
211; PPC64BE-NEXT:    std r0, 64(r1)
212; PPC64BE-NEXT:    #APP
213; PPC64BE-NEXT:    #NO_APP
214; PPC64BE-NEXT:    addi r1, r1, 48
215; PPC64BE-NEXT:    ld r0, 16(r1)
216; PPC64BE-NEXT:    mtlr r0
217; PPC64BE-NEXT:    blr
218entry:
219  tail call i64 asm sideeffect "", "=&{lr}"()
220  ret void
221}
222
223define dso_local void @ClobberMulti() local_unnamed_addr #0 {
224; PPC64LE-LABEL: ClobberMulti:
225; PPC64LE:       # %bb.0: # %entry
226; PPC64LE-NEXT:    mflr r0
227; PPC64LE-NEXT:    std r15, -136(r1) # 8-byte Folded Spill
228; PPC64LE-NEXT:    std r16, -128(r1) # 8-byte Folded Spill
229; PPC64LE-NEXT:    stdu r1, -176(r1)
230; PPC64LE-NEXT:    std r0, 192(r1)
231; PPC64LE-NEXT:    #APP
232; PPC64LE-NEXT:    #NO_APP
233; PPC64LE-NEXT:    addi r1, r1, 176
234; PPC64LE-NEXT:    ld r0, 16(r1)
235; PPC64LE-NEXT:    ld r16, -128(r1) # 8-byte Folded Reload
236; PPC64LE-NEXT:    ld r15, -136(r1) # 8-byte Folded Reload
237; PPC64LE-NEXT:    mtlr r0
238; PPC64LE-NEXT:    blr
239;
240; PPC64BE-LABEL: ClobberMulti:
241; PPC64BE:       # %bb.0: # %entry
242; PPC64BE-NEXT:    mflr r0
243; PPC64BE-NEXT:    stdu r1, -192(r1)
244; PPC64BE-NEXT:    std r0, 208(r1)
245; PPC64BE-NEXT:    std r15, 56(r1) # 8-byte Folded Spill
246; PPC64BE-NEXT:    std r16, 64(r1) # 8-byte Folded Spill
247; PPC64BE-NEXT:    #APP
248; PPC64BE-NEXT:    #NO_APP
249; PPC64BE-NEXT:    ld r16, 64(r1) # 8-byte Folded Reload
250; PPC64BE-NEXT:    ld r15, 56(r1) # 8-byte Folded Reload
251; PPC64BE-NEXT:    addi r1, r1, 192
252; PPC64BE-NEXT:    ld r0, 16(r1)
253; PPC64BE-NEXT:    mtlr r0
254; PPC64BE-NEXT:    blr
255entry:
256  tail call void asm sideeffect "", "~{lr},~{r15},~{r16}"()
257  ret void
258}
259
260attributes #0 = { nounwind }
261