xref: /llvm-project/llvm/test/CodeGen/BPF/bpf-fastcall-regmask-1.ll (revision c5037db4acd95790a0ca5061c8fa79c5c291607e)
1; RUN: llc -O2 --mtriple=bpfel \
2; RUN:   -print-after=stack-slot-coloring %s \
3; RUN:   -o /dev/null 2>&1 | FileCheck %s
4
5; Generated from the following C code:
6;
7;   #define __bpf_fastcall __attribute__((bpf_fastcall))
8;
9;   void bar1(void) __bpf_fastcall;
10;   void buz1(long i, long j, long k);
11;   void foo1(long i, long j, long k) {
12;     bar1();
13;     buz1(i, j, k);
14;   }
15;
16;   long bar2(void) __bpf_fastcall;
17;   void buz2(long i, long j, long k);
18;   void foo2(long i, long j, long k) {
19;     bar2();
20;     buz2(i, j, k);
21;   }
22;
23;   void bar3(long) __bpf_fastcall;
24;   void buz3(long i, long j, long k);
25;   void foo3(long i, long j, long k) {
26;     bar3(i);
27;     buz3(i, j, k);
28;   }
29;
30;   long bar4(long, long) __bpf_fastcall;
31;   void buz4(long i, long j, long k);
32;   void foo4(long i, long j, long k) {
33;     bar4(i, j);
34;     buz4(i, j, k);
35;   }
36;
37; Using the following command:
38;
39;   clang --target=bpf -emit-llvm -O2 -S -o - t.c
40;
41; (unnecessary attrs removed maually)
42
43; Check regmask for calls to functions marked with bpf_fastcall:
44; - void function w/o parameters
45; - non-void function w/o parameters
46; - void function with parameters
47; - non-void function with parameters
48
49declare dso_local void @bar1() #0
50declare dso_local void @buz1(i64 noundef, i64 noundef, i64 noundef)
51define dso_local void @foo1(i64 noundef %i, i64 noundef %j, i64 noundef %k) {
52entry:
53  tail call void @bar1() #1
54  tail call void @buz1(i64 noundef %i, i64 noundef %j, i64 noundef %k)
55  ret void
56}
57
58; CHECK:      JAL @bar1, <regmask $r0 $r1 $r2 $r3 $r4 $r5 $r6 $r7 $r8 $r9 $r10
59; CHECK-SAME:                     $w0 $w1 $w2 $w3 $w4 $w5 $w6 $w7 $w8 $w9 $w10>
60; CHECK-SAME:          , implicit $r11, implicit-def $r11
61; CHECK:      JAL @buz1, <regmask $r6 $r7 $r8 $r9 $r10 $w6 $w7 $w8 $w9 $w10>
62; CHECK-SAME:          , implicit $r11, implicit $r1, implicit $r2, implicit $r3, implicit-def $r11
63
64declare dso_local i64 @bar2() #0
65declare dso_local void @buz2(i64 noundef, i64 noundef, i64 noundef)
66define dso_local void @foo2(i64 noundef %i, i64 noundef %j, i64 noundef %k) {
67entry:
68  tail call i64 @bar2() #1
69  tail call void @buz2(i64 noundef %i, i64 noundef %j, i64 noundef %k)
70  ret void
71}
72
73; CHECK:      JAL @bar2, <regmask $r1 $r2 $r3 $r4 $r5 $r6 $r7 $r8 $r9 $r10
74; CHECK-SAME:                     $w1 $w2 $w3 $w4 $w5 $w6 $w7 $w8 $w9 $w10>
75; CHECK-SAME:          , implicit $r11, implicit-def $r11, implicit-def dead $r0
76; CHECK:      JAL @buz2, <regmask $r6 $r7 $r8 $r9 $r10 $w6 $w7 $w8 $w9 $w10>
77; CHECK-SAME:          , implicit $r11, implicit $r1, implicit $r2, implicit $r3, implicit-def $r11
78
79declare dso_local void @bar3(i64) #0
80declare dso_local void @buz3(i64 noundef, i64 noundef, i64 noundef)
81define dso_local void @foo3(i64 noundef %i, i64 noundef %j, i64 noundef %k) {
82entry:
83  tail call void @bar3(i64 noundef %i) #1
84  tail call void @buz3(i64 noundef %i, i64 noundef %j, i64 noundef %k)
85  ret void
86}
87
88; CHECK:      JAL @bar3, <regmask $r0 $r2 $r3 $r4 $r5 $r6 $r7 $r8 $r9 $r10
89; CHECK-SAME:                     $w0 $w2 $w3 $w4 $w5 $w6 $w7 $w8 $w9 $w10>
90; CHECK-SAME:          , implicit $r11, implicit $r1, implicit-def $r11
91; CHECK:      JAL @buz3, <regmask $r6 $r7 $r8 $r9 $r10 $w6 $w7 $w8 $w9 $w10>
92; CHECK-SAME:          , implicit $r11, implicit $r1, implicit $r2, implicit $r3, implicit-def $r11
93
94declare dso_local i64 @bar4(i64 noundef, i64 noundef) #0
95declare dso_local void @buz4(i64 noundef, i64 noundef, i64 noundef)
96define dso_local void @foo4(i64 noundef %i, i64 noundef %j, i64 noundef %k) {
97entry:
98  tail call i64 @bar4(i64 noundef %i, i64 noundef %j) #1
99  tail call void @buz4(i64 noundef %i, i64 noundef %j, i64 noundef %k)
100  ret void
101}
102
103; CHECK:      JAL @bar4, <regmask $r3 $r4 $r5 $r6 $r7 $r8 $r9 $r10
104; CHECK-SAME:                     $w3 $w4 $w5 $w6 $w7 $w8 $w9 $w10>
105; CHECK-SAME:          , implicit $r11, implicit $r1, implicit $r2, implicit-def $r11, implicit-def dead $r0
106; CHECK:      JAL @buz4, <regmask $r6 $r7 $r8 $r9 $r10 $w6 $w7 $w8 $w9 $w10>
107; CHECK-SAME:          , implicit $r11, implicit $r1, implicit $r2, implicit $r3, implicit-def $r11
108
109attributes #0 = { "bpf_fastcall" }
110attributes #1 = { nounwind "bpf_fastcall" }
111