xref: /llvm-project/llvm/test/Transforms/Inline/AArch64/binop.ll (revision 220756f1f92b335cbafdff67c570d096a6925d87)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2; RUN: opt -passes=inline -mtriple=aarch64--linux-gnu -S -o - < %s -inline-threshold=0 | FileCheck %s
3
4target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
5target triple = "aarch64--linux-gnu"
6
7declare void @pad()
8@glbl = external global i32
9
10define i32 @outer_add1(i32 %a) {
11; CHECK-LABEL: define i32 @outer_add1(
12; CHECK-SAME: i32 [[A:%.*]]) {
13; CHECK-NEXT:    call void @pad()
14; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
15; CHECK-NEXT:    ret i32 [[A]]
16;
17  %C = call i32 @add(i32 %a, i32 0)
18  ret i32 %C
19}
20
21define i32 @outer_add2(i32 %a) {
22; CHECK-LABEL: define i32 @outer_add2(
23; CHECK-SAME: i32 [[A:%.*]]) {
24; CHECK-NEXT:    call void @pad()
25; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
26; CHECK-NEXT:    ret i32 [[A]]
27;
28  %C = call i32 @add(i32 0, i32 %a)
29  ret i32 %C
30}
31
32define i32 @add(i32 %a, i32 %b) {
33; CHECK-LABEL: define i32 @add(
34; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
35; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[A]], [[B]]
36; CHECK-NEXT:    call void @pad()
37; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
38; CHECK-NEXT:    ret i32 [[ADD]]
39;
40  %add = add i32 %a, %b
41  call void @pad()
42  store i32 0, ptr @glbl
43  ret i32 %add
44}
45
46
47
48define i32 @outer_sub1(i32 %a) {
49; CHECK-LABEL: define i32 @outer_sub1(
50; CHECK-SAME: i32 [[A:%.*]]) {
51; CHECK-NEXT:    call void @pad()
52; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
53; CHECK-NEXT:    ret i32 [[A]]
54;
55  %C = call i32 @sub1(i32 %a, i32 0)
56  ret i32 %C
57}
58
59define i32 @sub1(i32 %a, i32 %b) {
60; CHECK-LABEL: define i32 @sub1(
61; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
62; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[A]], [[B]]
63; CHECK-NEXT:    call void @pad()
64; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
65; CHECK-NEXT:    ret i32 [[SUB]]
66;
67  %sub = sub i32 %a, %b
68  call void @pad()
69  store i32 0, ptr @glbl
70  ret i32 %sub
71}
72
73
74define i32 @outer_sub2(i32 %a) {
75; CHECK-LABEL: define i32 @outer_sub2(
76; CHECK-SAME: i32 [[A:%.*]]) {
77; CHECK-NEXT:    call void @pad()
78; CHECK-NEXT:    ret i32 0
79;
80  %C = call i32 @sub2(i32 %a)
81  ret i32 %C
82}
83
84define i32 @sub2(i32 %a) {
85; CHECK-LABEL: define i32 @sub2(
86; CHECK-SAME: i32 [[A:%.*]]) {
87; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[A]], [[A]]
88; CHECK-NEXT:    call void @pad()
89; CHECK-NEXT:    ret i32 [[SUB]]
90;
91  %sub = sub i32 %a, %a
92  call void @pad()
93  ret i32 %sub
94}
95
96
97
98define i32 @outer_mul1(i32 %a) {
99; CHECK-LABEL: define i32 @outer_mul1(
100; CHECK-SAME: i32 [[A:%.*]]) {
101; CHECK-NEXT:    call void @pad()
102; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
103; CHECK-NEXT:    ret i32 0
104;
105  %C = call i32 @mul(i32 %a, i32 0)
106  ret i32 %C
107}
108
109define i32 @outer_mul2(i32 %a) {
110; CHECK-LABEL: define i32 @outer_mul2(
111; CHECK-SAME: i32 [[A:%.*]]) {
112; CHECK-NEXT:    call void @pad()
113; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
114; CHECK-NEXT:    ret i32 [[A]]
115;
116  %C = call i32 @mul(i32 %a, i32 1)
117  ret i32 %C
118}
119
120define i32 @mul(i32 %a, i32 %b) {
121; CHECK-LABEL: define i32 @mul(
122; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
123; CHECK-NEXT:    [[MUL:%.*]] = mul i32 [[A]], [[B]]
124; CHECK-NEXT:    call void @pad()
125; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
126; CHECK-NEXT:    ret i32 [[MUL]]
127;
128  %mul = mul i32 %a, %b
129  call void @pad()
130  store i32 0, ptr @glbl
131  ret i32 %mul
132}
133
134
135
136define i32 @outer_div1(i32 %a) {
137; CHECK-LABEL: define i32 @outer_div1(
138; CHECK-SAME: i32 [[A:%.*]]) {
139; CHECK-NEXT:    call void @pad()
140; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
141; CHECK-NEXT:    ret i32 0
142;
143  %C = call i32 @div1(i32 0, i32 %a)
144  ret i32 %C
145}
146
147define i32 @outer_div2(i32 %a) {
148; CHECK-LABEL: define i32 @outer_div2(
149; CHECK-SAME: i32 [[A:%.*]]) {
150; CHECK-NEXT:    call void @pad()
151; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
152; CHECK-NEXT:    ret i32 [[A]]
153;
154  %C = call i32 @div1(i32 %a, i32 1)
155  ret i32 %C
156}
157
158define i32 @div1(i32 %a, i32 %b) {
159; CHECK-LABEL: define i32 @div1(
160; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
161; CHECK-NEXT:    [[DIV:%.*]] = sdiv i32 [[A]], [[B]]
162; CHECK-NEXT:    call void @pad()
163; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
164; CHECK-NEXT:    ret i32 [[DIV]]
165;
166  %div = sdiv i32 %a, %b
167  call void @pad()
168  store i32 0, ptr @glbl
169  ret i32 %div
170}
171
172
173define i32 @outer_div3(i32 %a) {
174; CHECK-LABEL: define i32 @outer_div3(
175; CHECK-SAME: i32 [[A:%.*]]) {
176; CHECK-NEXT:    call void @pad()
177; CHECK-NEXT:    ret i32 1
178;
179  %C = call i32 @div2(i32 %a)
180  ret i32 %C
181}
182
183define i32 @div2(i32 %a) {
184; CHECK-LABEL: define i32 @div2(
185; CHECK-SAME: i32 [[A:%.*]]) {
186; CHECK-NEXT:    [[DIV:%.*]] = sdiv i32 [[A]], [[A]]
187; CHECK-NEXT:    call void @pad()
188; CHECK-NEXT:    ret i32 [[DIV]]
189;
190  %div = sdiv i32 %a, %a
191  call void @pad()
192  ret i32 %div
193}
194
195
196
197define i32 @outer_rem1(i32 %a) {
198; CHECK-LABEL: define i32 @outer_rem1(
199; CHECK-SAME: i32 [[A:%.*]]) {
200; CHECK-NEXT:    call void @pad()
201; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
202; CHECK-NEXT:    ret i32 0
203;
204  %C = call i32 @rem1(i32 0, i32 %a)
205  ret i32 %C
206}
207
208define i32 @outer_rem2(i32 %a) {
209; CHECK-LABEL: define i32 @outer_rem2(
210; CHECK-SAME: i32 [[A:%.*]]) {
211; CHECK-NEXT:    call void @pad()
212; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
213; CHECK-NEXT:    ret i32 0
214;
215  %C = call i32 @rem1(i32 %a, i32 1)
216  ret i32 %C
217}
218
219define i32 @rem1(i32 %a, i32 %b) {
220; CHECK-LABEL: define i32 @rem1(
221; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
222; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[A]], [[B]]
223; CHECK-NEXT:    call void @pad()
224; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
225; CHECK-NEXT:    ret i32 [[REM]]
226;
227  %rem = urem i32 %a, %b
228  call void @pad()
229  store i32 0, ptr @glbl
230  ret i32 %rem
231}
232
233
234define i32 @outer_rem3(i32 %a) {
235; CHECK-LABEL: define i32 @outer_rem3(
236; CHECK-SAME: i32 [[A:%.*]]) {
237; CHECK-NEXT:    call void @pad()
238; CHECK-NEXT:    ret i32 0
239;
240  %C = call i32 @rem2(i32 %a)
241  ret i32 %C
242}
243
244define i32 @rem2(i32 %a) {
245; CHECK-LABEL: define i32 @rem2(
246; CHECK-SAME: i32 [[A:%.*]]) {
247; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[A]], [[A]]
248; CHECK-NEXT:    call void @pad()
249; CHECK-NEXT:    ret i32 [[REM]]
250;
251  %rem = urem i32 %a, %a
252  call void @pad()
253  ret i32 %rem
254}
255
256
257
258define i32 @outer_shl1(i32 %a) {
259; CHECK-LABEL: define i32 @outer_shl1(
260; CHECK-SAME: i32 [[A:%.*]]) {
261; CHECK-NEXT:    call void @pad()
262; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
263; CHECK-NEXT:    ret i32 [[A]]
264;
265  %C = call i32 @shl(i32 %a, i32 0)
266  ret i32 %C
267}
268
269define i32 @shl(i32 %a, i32 %b) {
270; CHECK-LABEL: define i32 @shl(
271; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
272; CHECK-NEXT:    [[SHL:%.*]] = shl i32 [[A]], [[B]]
273; CHECK-NEXT:    call void @pad()
274; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
275; CHECK-NEXT:    ret i32 [[SHL]]
276;
277  %shl = shl i32 %a, %b
278  call void @pad()
279  store i32 0, ptr @glbl
280  ret i32 %shl
281}
282
283
284
285define i32 @outer_shr1(i32 %a) {
286; CHECK-LABEL: define i32 @outer_shr1(
287; CHECK-SAME: i32 [[A:%.*]]) {
288; CHECK-NEXT:    call void @pad()
289; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
290; CHECK-NEXT:    ret i32 [[A]]
291;
292  %C = call i32 @shr(i32 %a, i32 0)
293  ret i32 %C
294}
295
296define i32 @shr(i32 %a, i32 %b) {
297; CHECK-LABEL: define i32 @shr(
298; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
299; CHECK-NEXT:    [[SHR:%.*]] = ashr i32 [[A]], [[B]]
300; CHECK-NEXT:    call void @pad()
301; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
302; CHECK-NEXT:    ret i32 [[SHR]]
303;
304  %shr = ashr i32 %a, %b
305  call void @pad()
306  store i32 0, ptr @glbl
307  ret i32 %shr
308}
309
310
311
312define i1 @outer_and1(i1 %a) {
313; CHECK-LABEL: define i1 @outer_and1(
314; CHECK-SAME: i1 [[A:%.*]]) {
315; CHECK-NEXT:    call void @pad()
316; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
317; CHECK-NEXT:    ret i1 false
318;
319  %c = call i1 @and1(i1 %a, i1 false)
320  ret i1 %c
321}
322
323define i1 @outer_and2(i1 %a) {
324; CHECK-LABEL: define i1 @outer_and2(
325; CHECK-SAME: i1 [[A:%.*]]) {
326; CHECK-NEXT:    call void @pad()
327; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
328; CHECK-NEXT:    ret i1 [[A]]
329;
330  %c = call i1 @and1(i1 %a, i1 true)
331  ret i1 %c
332}
333
334define i1 @and1(i1 %a, i1 %b) {
335; CHECK-LABEL: define i1 @and1(
336; CHECK-SAME: i1 [[A:%.*]], i1 [[B:%.*]]) {
337; CHECK-NEXT:    [[AND:%.*]] = and i1 [[A]], [[B]]
338; CHECK-NEXT:    call void @pad()
339; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
340; CHECK-NEXT:    ret i1 [[AND]]
341;
342  %and = and i1 %a, %b
343  call void @pad()
344  store i32 0, ptr @glbl
345  ret i1 %and
346}
347
348
349define i1 @outer_and3(i1 %a) {
350; CHECK-LABEL: define i1 @outer_and3(
351; CHECK-SAME: i1 [[A:%.*]]) {
352; CHECK-NEXT:    call void @pad()
353; CHECK-NEXT:    ret i1 [[A]]
354;
355  %c = call i1 @and2(i1 %a)
356  ret i1 %c
357}
358
359define i1 @and2(i1 %a) {
360; CHECK-LABEL: define i1 @and2(
361; CHECK-SAME: i1 [[A:%.*]]) {
362; CHECK-NEXT:    [[AND:%.*]] = and i1 [[A]], [[A]]
363; CHECK-NEXT:    call void @pad()
364; CHECK-NEXT:    ret i1 [[AND]]
365;
366  %and = and i1 %a, %a
367  call void @pad()
368  ret i1 %and
369}
370
371
372
373define i1 @outer_or1(i1 %a) {
374; CHECK-LABEL: define i1 @outer_or1(
375; CHECK-SAME: i1 [[A:%.*]]) {
376; CHECK-NEXT:    call void @pad()
377; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
378; CHECK-NEXT:    ret i1 [[A]]
379;
380  %c = call i1 @or1(i1 %a, i1 false)
381  ret i1 %c
382}
383
384define i1 @outer_or2(i1 %a) {
385; CHECK-LABEL: define i1 @outer_or2(
386; CHECK-SAME: i1 [[A:%.*]]) {
387; CHECK-NEXT:    call void @pad()
388; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
389; CHECK-NEXT:    ret i1 true
390;
391  %c = call i1 @or1(i1 %a, i1 true)
392  ret i1 %c
393}
394
395define i1 @or1(i1 %a, i1 %b) {
396; CHECK-LABEL: define i1 @or1(
397; CHECK-SAME: i1 [[A:%.*]], i1 [[B:%.*]]) {
398; CHECK-NEXT:    [[OR:%.*]] = or i1 [[A]], [[B]]
399; CHECK-NEXT:    call void @pad()
400; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
401; CHECK-NEXT:    ret i1 [[OR]]
402;
403  %or = or i1 %a, %b
404  call void @pad()
405  store i32 0, ptr @glbl
406  ret i1 %or
407}
408
409
410define i1 @outer_or3(i1 %a) {
411; CHECK-LABEL: define i1 @outer_or3(
412; CHECK-SAME: i1 [[A:%.*]]) {
413; CHECK-NEXT:    call void @pad()
414; CHECK-NEXT:    ret i1 [[A]]
415;
416  %c = call i1 @or2(i1 %a)
417  ret i1 %c
418}
419
420define i1 @or2(i1 %a) {
421; CHECK-LABEL: define i1 @or2(
422; CHECK-SAME: i1 [[A:%.*]]) {
423; CHECK-NEXT:    [[OR:%.*]] = or i1 [[A]], [[A]]
424; CHECK-NEXT:    call void @pad()
425; CHECK-NEXT:    ret i1 [[OR]]
426;
427  %or = or i1 %a, %a
428  call void @pad()
429  ret i1 %or
430}
431
432
433
434define i1 @outer_xor1(i1 %a) {
435; CHECK-LABEL: define i1 @outer_xor1(
436; CHECK-SAME: i1 [[A:%.*]]) {
437; CHECK-NEXT:    call void @pad()
438; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
439; CHECK-NEXT:    ret i1 [[A]]
440;
441  %c = call i1 @xor1(i1 %a, i1 false)
442  ret i1 %c
443}
444
445define i1 @xor1(i1 %a, i1 %b) {
446; CHECK-LABEL: define i1 @xor1(
447; CHECK-SAME: i1 [[A:%.*]], i1 [[B:%.*]]) {
448; CHECK-NEXT:    [[XOR:%.*]] = xor i1 [[A]], [[B]]
449; CHECK-NEXT:    call void @pad()
450; CHECK-NEXT:    store i32 0, ptr @glbl, align 4
451; CHECK-NEXT:    ret i1 [[XOR]]
452;
453  %xor = xor i1 %a, %b
454  call void @pad()
455  store i32 0, ptr @glbl
456  ret i1 %xor
457}
458
459
460define i1 @outer_xor3(i1 %a) {
461; CHECK-LABEL: define i1 @outer_xor3(
462; CHECK-SAME: i1 [[A:%.*]]) {
463; CHECK-NEXT:    call void @pad()
464; CHECK-NEXT:    ret i1 false
465;
466  %c = call i1 @xor2(i1 %a)
467  ret i1 %c
468}
469
470define i1 @xor2(i1 %a) {
471; CHECK-LABEL: define i1 @xor2(
472; CHECK-SAME: i1 [[A:%.*]]) {
473; CHECK-NEXT:    [[XOR:%.*]] = xor i1 [[A]], [[A]]
474; CHECK-NEXT:    call void @pad()
475; CHECK-NEXT:    ret i1 [[XOR]]
476;
477  %xor = xor i1 %a, %a
478  call void @pad()
479  ret i1 %xor
480}
481