xref: /llvm-project/llvm/test/CodeGen/BPF/sanity.ll (revision 7852ebc088b925ef1c1940cbd56a93d9f8e3e330)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=bpfel -mcpu=v1 -- | FileCheck %s
3
4@foo_printf.fmt = private unnamed_addr constant [9 x i8] c"hello  \0A\00", align 1
5
6; Function Attrs: nounwind readnone uwtable
7define i32 @foo_int(i32 %a, i32 %b) #0 {
8; CHECK-LABEL: foo_int:
9; CHECK:       # %bb.0:
10; CHECK-NEXT:    r0 = r2
11; CHECK-NEXT:    r0 += r1
12; CHECK-NEXT:    exit
13  %1 = add nsw i32 %b, %a
14  ret i32 %1
15}
16
17; Function Attrs: nounwind readnone uwtable
18define signext i8 @foo_char(i8 signext %a, i8 signext %b) #0 {
19; CHECK-LABEL: foo_char:
20; CHECK:       # %bb.0:
21; CHECK-NEXT:    r0 = r2
22; CHECK-NEXT:    r0 += r1
23; CHECK-NEXT:    r0 <<= 56
24; CHECK-NEXT:    r0 s>>= 56
25; CHECK-NEXT:    exit
26  %1 = add i8 %b, %a
27  ret i8 %1
28}
29
30; Function Attrs: nounwind readnone uwtable
31define i64 @foo_ll(i64 %a, i64 %b, i64 %c) #0 {
32; CHECK-LABEL: foo_ll:
33; CHECK:       # %bb.0:
34; CHECK-NEXT:    r0 = r2
35; CHECK-NEXT:    r0 += r1
36; CHECK-NEXT:    r0 -= r3
37; CHECK-NEXT:    exit
38  %1 = add nsw i64 %b, %a
39  %2 = sub i64 %1, %c
40  ret i64 %2
41}
42
43; Function Attrs: nounwind uwtable
44define void @foo_call2(i32 %a, i32 %b) #1 {
45; CHECK-LABEL: foo_call2:
46; CHECK:       # %bb.0:
47; CHECK-NEXT:    r3 = r1
48; CHECK-NEXT:    r2 <<= 56
49; CHECK-NEXT:    r2 s>>= 56
50; CHECK-NEXT:    r1 = r2
51; CHECK-NEXT:    r2 = r3
52; CHECK-NEXT:    call foo_2arg
53; CHECK-NEXT:    exit
54  %1 = trunc i32 %b to i8
55  tail call void @foo_2arg(i8 signext %1, i32 %a) #3
56  ret void
57}
58
59declare void @foo_2arg(i8 signext, i32) #2
60
61; Function Attrs: nounwind uwtable
62define i32 @foo_call5(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #1 {
63; CHECK-LABEL: foo_call5:
64; CHECK:       # %bb.0:
65; CHECK-NEXT:    call bar
66; CHECK-NEXT:    r0 = 0
67; CHECK-NEXT:    exit
68  %1 = tail call i32 @bar(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #3
69  ret i32 0
70}
71
72declare i32 @bar(i8 signext, i16 signext, i32, i64) #2
73
74; Function Attrs: nounwind readnone uwtable
75define signext i8 @foo_cmp(i8 signext %a, i8 signext %b) #0 {
76; CHECK-LABEL: foo_cmp:
77; CHECK:       # %bb.0:
78; CHECK-NEXT:    r0 = r1
79; CHECK-NEXT:    if r2 s> r0 goto LBB5_2
80; CHECK-NEXT:  # %bb.1:
81; CHECK-NEXT:    r0 = r2
82; CHECK-NEXT:  LBB5_2:
83; CHECK-NEXT:    exit
84  %1 = icmp slt i8 %a, %b
85  %a.b = select i1 %1, i8 %a, i8 %b
86  ret i8 %a.b
87}
88
89; Function Attrs: nounwind readnone uwtable
90define i32 @foo_muldiv(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #0 {
91; CHECK-LABEL: foo_muldiv:
92; CHECK:       # %bb.0:
93; CHECK-NEXT:    r0 = r2
94; CHECK-NEXT:    if r1 == 0 goto LBB6_2
95; CHECK-NEXT:  # %bb.1:
96; CHECK-NEXT:    r0 *= r3
97; CHECK-NEXT:    goto LBB6_3
98; CHECK-NEXT:  LBB6_2:
99; CHECK-NEXT:    r3 <<= 32
100; CHECK-NEXT:    r3 >>= 32
101; CHECK-NEXT:    r4 <<= 32
102; CHECK-NEXT:    r4 >>= 32
103; CHECK-NEXT:    r4 /= r3
104; CHECK-NEXT:    r0 = r4
105; CHECK-NEXT:  LBB6_3:
106; CHECK-NEXT:    exit
107  %1 = icmp eq i8 %a, 0
108  br i1 %1, label %5, label %2
109
110; <label>:2                                       ; preds = %0
111  %3 = sext i16 %b to i32
112  %4 = mul nsw i32 %3, %c
113  br label %8
114
115; <label>:5                                       ; preds = %0
116  %6 = trunc i64 %d to i32
117  %7 = udiv i32 %6, %c
118  br label %8
119
120; <label>:8                                       ; preds = %5, %2
121  %.0 = phi i32 [ %4, %2 ], [ %7, %5 ]
122  ret i32 %.0
123}
124
125; Function Attrs: nounwind uwtable
126define i32 @foo_optimized() #1 {
127; CHECK-LABEL: foo_optimized:
128; CHECK:       # %bb.0:
129; CHECK-NEXT:    r1 = 1
130; CHECK-NEXT:    r2 = 2
131; CHECK-NEXT:    r3 = 3
132; CHECK-NEXT:    r4 = 4
133; CHECK-NEXT:    r5 = 5
134; CHECK-NEXT:    call manyarg
135; CHECK-NEXT:    exit
136  %1 = tail call i32 @manyarg(i32 1, i32 2, i32 3, i32 4, i32 5) #3
137  ret i32 %1
138}
139
140declare i32 @manyarg(i32, i32, i32, i32, i32) #2
141
142; Function Attrs: nounwind uwtable
143define void @foo_printf() #1 {
144; CHECK-LABEL: foo_printf:
145; CHECK:       # %bb.0:
146; CHECK-NEXT:    r1 = 0
147; CHECK-NEXT:    *(u8 *)(r10 - 8) = r1
148; CHECK-NEXT:    r1 = 729618802566522216 ll
149; CHECK-NEXT:    *(u64 *)(r10 - 16) = r1
150; CHECK-NEXT:    r1 = r10
151; CHECK-NEXT:    r1 += -16
152; CHECK-NEXT:    call printf
153; CHECK-NEXT:    exit
154  %fmt = alloca [9 x i8], align 1
155  call void @llvm.memcpy.p0.p0.i64(ptr %fmt, ptr @foo_printf.fmt, i64 9, i1 false)
156  %1 = call i32 (ptr, ...) @printf(ptr %fmt) #3
157  ret void
158}
159
160; Function Attrs: nounwind
161declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) #3
162
163; Function Attrs: nounwind
164declare i32 @printf(ptr nocapture, ...) #4
165