; RUN: llc -O2 --mtriple=bpfel \ ; RUN: -print-after=stack-slot-coloring %s \ ; RUN: -o /dev/null 2>&1 | FileCheck %s ; Generated from the following C code: ; ; #define __bpf_fastcall __attribute__((bpf_fastcall)) ; ; void bar1(void) __bpf_fastcall; ; void buz1(long i, long j, long k); ; void foo1(long i, long j, long k) { ; bar1(); ; buz1(i, j, k); ; } ; ; long bar2(void) __bpf_fastcall; ; void buz2(long i, long j, long k); ; void foo2(long i, long j, long k) { ; bar2(); ; buz2(i, j, k); ; } ; ; void bar3(long) __bpf_fastcall; ; void buz3(long i, long j, long k); ; void foo3(long i, long j, long k) { ; bar3(i); ; buz3(i, j, k); ; } ; ; long bar4(long, long) __bpf_fastcall; ; void buz4(long i, long j, long k); ; void foo4(long i, long j, long k) { ; bar4(i, j); ; buz4(i, j, k); ; } ; ; Using the following command: ; ; clang --target=bpf -emit-llvm -O2 -S -o - t.c ; ; (unnecessary attrs removed maually) ; Check regmask for calls to functions marked with bpf_fastcall: ; - void function w/o parameters ; - non-void function w/o parameters ; - void function with parameters ; - non-void function with parameters declare dso_local void @bar1() #0 declare dso_local void @buz1(i64 noundef, i64 noundef, i64 noundef) define dso_local void @foo1(i64 noundef %i, i64 noundef %j, i64 noundef %k) { entry: tail call void @bar1() #1 tail call void @buz1(i64 noundef %i, i64 noundef %j, i64 noundef %k) ret void } ; CHECK: JAL @bar1, ; CHECK-SAME: , implicit $r11, implicit-def $r11 ; CHECK: JAL @buz1, ; CHECK-SAME: , implicit $r11, implicit $r1, implicit $r2, implicit $r3, implicit-def $r11 declare dso_local i64 @bar2() #0 declare dso_local void @buz2(i64 noundef, i64 noundef, i64 noundef) define dso_local void @foo2(i64 noundef %i, i64 noundef %j, i64 noundef %k) { entry: tail call i64 @bar2() #1 tail call void @buz2(i64 noundef %i, i64 noundef %j, i64 noundef %k) ret void } ; CHECK: JAL @bar2, ; CHECK-SAME: , implicit $r11, implicit-def $r11, implicit-def dead $r0 ; CHECK: JAL @buz2, ; CHECK-SAME: , implicit $r11, implicit $r1, implicit $r2, implicit $r3, implicit-def $r11 declare dso_local void @bar3(i64) #0 declare dso_local void @buz3(i64 noundef, i64 noundef, i64 noundef) define dso_local void @foo3(i64 noundef %i, i64 noundef %j, i64 noundef %k) { entry: tail call void @bar3(i64 noundef %i) #1 tail call void @buz3(i64 noundef %i, i64 noundef %j, i64 noundef %k) ret void } ; CHECK: JAL @bar3, ; CHECK-SAME: , implicit $r11, implicit $r1, implicit-def $r11 ; CHECK: JAL @buz3, ; CHECK-SAME: , implicit $r11, implicit $r1, implicit $r2, implicit $r3, implicit-def $r11 declare dso_local i64 @bar4(i64 noundef, i64 noundef) #0 declare dso_local void @buz4(i64 noundef, i64 noundef, i64 noundef) define dso_local void @foo4(i64 noundef %i, i64 noundef %j, i64 noundef %k) { entry: tail call i64 @bar4(i64 noundef %i, i64 noundef %j) #1 tail call void @buz4(i64 noundef %i, i64 noundef %j, i64 noundef %k) ret void } ; CHECK: JAL @bar4, ; CHECK-SAME: , implicit $r11, implicit $r1, implicit $r2, implicit-def $r11, implicit-def dead $r0 ; CHECK: JAL @buz4, ; CHECK-SAME: , implicit $r11, implicit $r1, implicit $r2, implicit $r3, implicit-def $r11 attributes #0 = { "bpf_fastcall" } attributes #1 = { nounwind "bpf_fastcall" }