xref: /llvm-project/llvm/test/CodeGen/PowerPC/ppc-clear-before-return.ll (revision b922a3621116b404d868af8b74cab25ab78555be)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -verify-machineinstrs -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown \
3; RUN:   -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefix=64BIT
4; RUN: llc -verify-machineinstrs -mcpu=pwr8 -mtriple=powerpc64-unknown-unknown \
5; RUN:   -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefix=64BIT
6; RUN: llc -O3 -mcpu=pwr8 -mtriple powerpc-ibm-aix -verify-machineinstrs \
7; RUN:   -ppc-asm-full-reg-names < %s | FileCheck --check-prefix=32BIT %s
8; RUN: llc -O3 -mcpu=pwr8 -mtriple powerpc64-ibm-aix -verify-machineinstrs \
9; RUN:   -ppc-asm-full-reg-names < %s | FileCheck --check-prefix=64BIT %s
10
11
12define dso_local i64 @test_xor(ptr nocapture noundef readonly %inp) local_unnamed_addr #0 {
13; 64BIT-LABEL: test_xor:
14; 64BIT:       # %bb.0: # %entry
15; 64BIT-NEXT:    lbz r4, 0(r3)
16; 64BIT-NEXT:    lbz r3, 1(r3)
17; 64BIT-NEXT:    xor r3, r3, r4
18; 64BIT-NEXT:    blr
19;
20; 32BIT-LABEL: test_xor:
21; 32BIT:       # %bb.0: # %entry
22; 32BIT-NEXT:    lbz r4, 0(r3)
23; 32BIT-NEXT:    lbz r3, 1(r3)
24; 32BIT-NEXT:    xor r4, r3, r4
25; 32BIT-NEXT:    li r3, 0
26; 32BIT-NEXT:    blr
27entry:
28  %0 = load i8, ptr %inp, align 1
29  %arrayidx1 = getelementptr inbounds i8, ptr %inp, i64 1
30  %1 = load i8, ptr %arrayidx1, align 1
31  %xor5 = xor i8 %1, %0
32  %conv3 = zext i8 %xor5 to i64
33  ret i64 %conv3
34}
35
36define dso_local i64 @test_xor2(ptr nocapture noundef readonly %inp) local_unnamed_addr #0 {
37; 64BIT-LABEL: test_xor2:
38; 64BIT:       # %bb.0: # %entry
39; 64BIT-NEXT:    lbz r4, 0(r3)
40; 64BIT-NEXT:    lbz r5, 1(r3)
41; 64BIT-NEXT:    lbz r3, 2(r3)
42; 64BIT-NEXT:    xor r4, r5, r4
43; 64BIT-NEXT:    xor r3, r4, r3
44; 64BIT-NEXT:    blr
45;
46; 32BIT-LABEL: test_xor2:
47; 32BIT:       # %bb.0: # %entry
48; 32BIT-NEXT:    lbz r4, 0(r3)
49; 32BIT-NEXT:    lbz r5, 1(r3)
50; 32BIT-NEXT:    lbz r3, 2(r3)
51; 32BIT-NEXT:    xor r4, r5, r4
52; 32BIT-NEXT:    xor r4, r4, r3
53; 32BIT-NEXT:    li r3, 0
54; 32BIT-NEXT:    blr
55entry:
56  %0 = load i8, ptr %inp, align 1
57  %arrayidx1 = getelementptr inbounds i8, ptr %inp, i64 1
58  %1 = load i8, ptr %arrayidx1, align 1
59  %xor9 = xor i8 %1, %0
60  %arrayidx3 = getelementptr inbounds i8, ptr %inp, i64 2
61  %2 = load i8, ptr %arrayidx3, align 1
62  %xor510 = xor i8 %xor9, %2
63  %conv6 = zext i8 %xor510 to i64
64  ret i64 %conv6
65}
66
67define dso_local i64 @test_or(ptr nocapture noundef readonly %inp) local_unnamed_addr #0 {
68; 64BIT-LABEL: test_or:
69; 64BIT:       # %bb.0: # %entry
70; 64BIT-NEXT:    lbz r4, 0(r3)
71; 64BIT-NEXT:    lbz r3, 1(r3)
72; 64BIT-NEXT:    or r3, r3, r4
73; 64BIT-NEXT:    blr
74;
75; 32BIT-LABEL: test_or:
76; 32BIT:       # %bb.0: # %entry
77; 32BIT-NEXT:    lbz r4, 0(r3)
78; 32BIT-NEXT:    lbz r3, 1(r3)
79; 32BIT-NEXT:    or r4, r3, r4
80; 32BIT-NEXT:    li r3, 0
81; 32BIT-NEXT:    blr
82entry:
83  %0 = load i8, ptr %inp, align 1
84  %arrayidx1 = getelementptr inbounds i8, ptr %inp, i64 1
85  %1 = load i8, ptr %arrayidx1, align 1
86  %or5 = or i8 %1, %0
87  %conv3 = zext i8 %or5 to i64
88  ret i64 %conv3
89}
90
91define dso_local i64 @test_or2(ptr nocapture noundef readonly %inp) local_unnamed_addr #0 {
92; 64BIT-LABEL: test_or2:
93; 64BIT:       # %bb.0: # %entry
94; 64BIT-NEXT:    lbz r4, 0(r3)
95; 64BIT-NEXT:    lbz r5, 1(r3)
96; 64BIT-NEXT:    lbz r3, 2(r3)
97; 64BIT-NEXT:    or r4, r5, r4
98; 64BIT-NEXT:    or r3, r4, r3
99; 64BIT-NEXT:    blr
100;
101; 32BIT-LABEL: test_or2:
102; 32BIT:       # %bb.0: # %entry
103; 32BIT-NEXT:    lbz r4, 0(r3)
104; 32BIT-NEXT:    lbz r5, 1(r3)
105; 32BIT-NEXT:    lbz r3, 2(r3)
106; 32BIT-NEXT:    or r4, r5, r4
107; 32BIT-NEXT:    or r4, r4, r3
108; 32BIT-NEXT:    li r3, 0
109; 32BIT-NEXT:    blr
110entry:
111  %0 = load i8, ptr %inp, align 1
112  %arrayidx1 = getelementptr inbounds i8, ptr %inp, i64 1
113  %1 = load i8, ptr %arrayidx1, align 1
114  %or9 = or i8 %1, %0
115  %arrayidx3 = getelementptr inbounds i8, ptr %inp, i64 2
116  %2 = load i8, ptr %arrayidx3, align 1
117  %or510 = or i8 %or9, %2
118  %conv6 = zext i8 %or510 to i64
119  ret i64 %conv6
120}
121
122define dso_local i64 @test_and(ptr nocapture noundef readonly %inp) local_unnamed_addr #0 {
123; 64BIT-LABEL: test_and:
124; 64BIT:       # %bb.0: # %entry
125; 64BIT-NEXT:    lbz r4, 0(r3)
126; 64BIT-NEXT:    lbz r3, 1(r3)
127; 64BIT-NEXT:    and r3, r3, r4
128; 64BIT-NEXT:    blr
129;
130; 32BIT-LABEL: test_and:
131; 32BIT:       # %bb.0: # %entry
132; 32BIT-NEXT:    lbz r4, 0(r3)
133; 32BIT-NEXT:    lbz r3, 1(r3)
134; 32BIT-NEXT:    and r4, r3, r4
135; 32BIT-NEXT:    li r3, 0
136; 32BIT-NEXT:    blr
137entry:
138  %0 = load i8, ptr %inp, align 1
139  %arrayidx1 = getelementptr inbounds i8, ptr %inp, i64 1
140  %1 = load i8, ptr %arrayidx1, align 1
141  %and5 = and i8 %1, %0
142  %conv3 = zext i8 %and5 to i64
143  ret i64 %conv3
144}
145
146define dso_local i64 @test_and2(ptr nocapture noundef readonly %inp) local_unnamed_addr #0 {
147; 64BIT-LABEL: test_and2:
148; 64BIT:       # %bb.0: # %entry
149; 64BIT-NEXT:    lbz r4, 0(r3)
150; 64BIT-NEXT:    lbz r5, 1(r3)
151; 64BIT-NEXT:    lbz r3, 2(r3)
152; 64BIT-NEXT:    and r4, r5, r4
153; 64BIT-NEXT:    and r3, r4, r3
154; 64BIT-NEXT:    blr
155;
156; 32BIT-LABEL: test_and2:
157; 32BIT:       # %bb.0: # %entry
158; 32BIT-NEXT:    lbz r4, 0(r3)
159; 32BIT-NEXT:    lbz r5, 1(r3)
160; 32BIT-NEXT:    lbz r3, 2(r3)
161; 32BIT-NEXT:    and r4, r5, r4
162; 32BIT-NEXT:    and r4, r4, r3
163; 32BIT-NEXT:    li r3, 0
164; 32BIT-NEXT:    blr
165entry:
166  %0 = load i8, ptr %inp, align 1
167  %arrayidx1 = getelementptr inbounds i8, ptr %inp, i64 1
168  %1 = load i8, ptr %arrayidx1, align 1
169  %and9 = and i8 %1, %0
170  %arrayidx3 = getelementptr inbounds i8, ptr %inp, i64 2
171  %2 = load i8, ptr %arrayidx3, align 1
172  %and510 = and i8 %and9, %2
173  %conv6 = zext i8 %and510 to i64
174  ret i64 %conv6
175}
176
177define dso_local i64 @test_mixed(ptr nocapture noundef readonly %inp) local_unnamed_addr #0 {
178; 64BIT-LABEL: test_mixed:
179; 64BIT:       # %bb.0: # %entry
180; 64BIT-NEXT:    lbz r4, 0(r3)
181; 64BIT-NEXT:    lbz r5, 1(r3)
182; 64BIT-NEXT:    and r4, r5, r4
183; 64BIT-NEXT:    lbz r5, 2(r3)
184; 64BIT-NEXT:    lbz r3, 3(r3)
185; 64BIT-NEXT:    xor r4, r4, r5
186; 64BIT-NEXT:    or r3, r4, r3
187; 64BIT-NEXT:    blr
188;
189; 32BIT-LABEL: test_mixed:
190; 32BIT:       # %bb.0: # %entry
191; 32BIT-NEXT:    lbz r4, 0(r3)
192; 32BIT-NEXT:    lbz r5, 1(r3)
193; 32BIT-NEXT:    and r4, r5, r4
194; 32BIT-NEXT:    lbz r5, 2(r3)
195; 32BIT-NEXT:    lbz r3, 3(r3)
196; 32BIT-NEXT:    xor r4, r4, r5
197; 32BIT-NEXT:    or r4, r4, r3
198; 32BIT-NEXT:    li r3, 0
199; 32BIT-NEXT:    blr
200entry:
201  %0 = load i8, ptr %inp, align 1
202  %arrayidx1 = getelementptr inbounds i8, ptr %inp, i64 1
203  %1 = load i8, ptr %arrayidx1, align 1
204  %and11 = and i8 %1, %0
205  %arrayidx3 = getelementptr inbounds i8, ptr %inp, i64 2
206  %2 = load i8, ptr %arrayidx3, align 1
207  %xor12 = xor i8 %and11, %2
208  %arrayidx5 = getelementptr inbounds i8, ptr %inp, i64 3
209  %3 = load i8, ptr %arrayidx5, align 1
210  %or13 = or i8 %xor12, %3
211  %conv7 = zext i8 %or13 to i64
212  ret i64 %conv7
213}
214
215define dso_local i64 @test_mixedtype(ptr nocapture noundef readonly %inp, ptr nocapture noundef readonly %inp2) local_unnamed_addr #0 {
216; 64BIT-LABEL: test_mixedtype:
217; 64BIT:       # %bb.0: # %entry
218; 64BIT-NEXT:    lbz r5, 0(r3)
219; 64BIT-NEXT:    lhz r6, 2(r4)
220; 64BIT-NEXT:    lbz r3, 2(r3)
221; 64BIT-NEXT:    lhz r4, 6(r4)
222; 64BIT-NEXT:    and r5, r6, r5
223; 64BIT-NEXT:    xor r3, r5, r3
224; 64BIT-NEXT:    or r3, r3, r4
225; 64BIT-NEXT:    blr
226;
227; 32BIT-LABEL: test_mixedtype:
228; 32BIT:       # %bb.0: # %entry
229; 32BIT-NEXT:    lbz r5, 0(r3)
230; 32BIT-NEXT:    lhz r6, 2(r4)
231; 32BIT-NEXT:    lbz r3, 2(r3)
232; 32BIT-NEXT:    lhz r4, 6(r4)
233; 32BIT-NEXT:    and r5, r6, r5
234; 32BIT-NEXT:    xor r3, r5, r3
235; 32BIT-NEXT:    or r3, r3, r4
236; 32BIT-NEXT:    clrlwi r4, r3, 16
237; 32BIT-NEXT:    li r3, 0
238; 32BIT-NEXT:    blr
239entry:
240  %0 = load i8, ptr %inp, align 1
241  %arrayidx1 = getelementptr inbounds i16, ptr %inp2, i64 1
242  %1 = load i16, ptr %arrayidx1, align 2
243  %2 = zext i8 %0 to i16
244  %3 = and i16 %1, %2
245  %arrayidx3 = getelementptr inbounds i8, ptr %inp, i64 2
246  %4 = load i8, ptr %arrayidx3, align 1
247  %5 = zext i8 %4 to i16
248  %6 = xor i16 %3, %5
249  %arrayidx5 = getelementptr inbounds i16, ptr %inp2, i64 3
250  %7 = load i16, ptr %arrayidx5, align 2
251  %or10 = or i16 %6, %7
252  %conv7 = zext i16 %or10 to i64
253  ret i64 %conv7
254}
255
256define dso_local i64 @test_load(ptr nocapture noundef readonly %inp) local_unnamed_addr #0 {
257; 64BIT-LABEL: test_load:
258; 64BIT:       # %bb.0: # %entry
259; 64BIT-NEXT:    lbz r3, 0(r3)
260; 64BIT-NEXT:    blr
261;
262; 32BIT-LABEL: test_load:
263; 32BIT:       # %bb.0: # %entry
264; 32BIT-NEXT:    lbz r4, 0(r3)
265; 32BIT-NEXT:    li r3, 0
266; 32BIT-NEXT:    blr
267entry:
268  %0 = load i8, ptr %inp, align 1
269  %conv = zext i8 %0 to i64
270  ret i64 %conv
271}
272
273define dso_local i64 @test_and32(ptr nocapture noundef readonly %inp) local_unnamed_addr #0 {
274; 64BIT-LABEL: test_and32:
275; 64BIT:       # %bb.0: # %entry
276; 64BIT-NEXT:    lwz r4, 0(r3)
277; 64BIT-NEXT:    lwz r3, 4(r3)
278; 64BIT-NEXT:    and r3, r3, r4
279; 64BIT-NEXT:    blr
280;
281; 32BIT-LABEL: test_and32:
282; 32BIT:       # %bb.0: # %entry
283; 32BIT-NEXT:    lwz r4, 0(r3)
284; 32BIT-NEXT:    lwz r3, 4(r3)
285; 32BIT-NEXT:    and r4, r3, r4
286; 32BIT-NEXT:    li r3, 0
287; 32BIT-NEXT:    blr
288entry:
289  %0 = load i32, ptr %inp, align 4
290  %arrayidx1 = getelementptr inbounds i32, ptr %inp, i64 1
291  %1 = load i32, ptr %arrayidx1, align 4
292  %and = and i32 %1, %0
293  %conv = zext i32 %and to i64
294  ret i64 %conv
295}
296
297define dso_local zeroext i8 @test_needsclear(ptr nocapture noundef readonly %inp) local_unnamed_addr #0 {
298; 64BIT-LABEL: test_needsclear:
299; 64BIT:       # %bb.0: # %entry
300; 64BIT-NEXT:    lwz r4, 0(r3)
301; 64BIT-NEXT:    lwz r3, 4(r3)
302; 64BIT-NEXT:    and r3, r3, r4
303; 64BIT-NEXT:    clrldi r3, r3, 56
304; 64BIT-NEXT:    blr
305;
306; 32BIT-LABEL: test_needsclear:
307; 32BIT:       # %bb.0: # %entry
308; 32BIT-NEXT:    lbz r4, 3(r3)
309; 32BIT-NEXT:    lbz r3, 7(r3)
310; 32BIT-NEXT:    and r3, r3, r4
311; 32BIT-NEXT:    blr
312entry:
313  %0 = load i32, ptr %inp, align 4
314  %arrayidx1 = getelementptr inbounds i32, ptr %inp, i64 1
315  %1 = load i32, ptr %arrayidx1, align 4
316  %and = and i32 %1, %0
317  %conv = trunc i32 %and to i8
318  ret i8 %conv
319}
320
321attributes #0 = {  nounwind  }
322