1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-24 13:33:37 +02:00
llvm-mirror/test/CodeGen/BPF/sanity.ll
Alexei Starovoitov 719b0399a8 convert bpf assembler to look like kernel verifier output
since bpf instruction set was introduced people learned to
read and understand kernel verifier output whereas llvm asm
output stayed obscure and unknown. Convert llvm to emit
assembler text similar to kernel to avoid this discrepancy

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
llvm-svn: 287300
2016-11-18 02:32:35 +00:00

118 lines
3.0 KiB
LLVM

; RUN: llc < %s -march=bpfel | FileCheck %s
@foo_printf.fmt = private unnamed_addr constant [9 x i8] c"hello \0A\00", align 1
; Function Attrs: nounwind readnone uwtable
define i32 @foo_int(i32 %a, i32 %b) #0 {
%1 = add nsw i32 %b, %a
ret i32 %1
; CHECK-LABEL: foo_int:
; CHECK: r2 += r1
}
; Function Attrs: nounwind readnone uwtable
define signext i8 @foo_char(i8 signext %a, i8 signext %b) #0 {
%1 = add i8 %b, %a
ret i8 %1
; CHECK-LABEL: foo_char:
; CHECK: r2 += r1
; CHECK: r2 <<= 56
; CHECK: r2 s>>= 56
}
; Function Attrs: nounwind readnone uwtable
define i64 @foo_ll(i64 %a, i64 %b, i64 %c) #0 {
%1 = add nsw i64 %b, %a
%2 = sub i64 %1, %c
ret i64 %2
; CHECK-LABEL: foo_ll:
; CHECK: r2 += r1
; CHECK: r2 -= r3
; CHECK: r0 = r2
}
; Function Attrs: nounwind uwtable
define void @foo_call2(i32 %a, i32 %b) #1 {
%1 = trunc i32 %b to i8
tail call void @foo_2arg(i8 signext %1, i32 %a) #3
ret void
; CHECK-LABEL: foo_call2:
; CHECK: r2 <<= 56
; CHECK: r2 s>>= 56
; CHECK: r1 = r2
}
declare void @foo_2arg(i8 signext, i32) #2
; Function Attrs: nounwind uwtable
define i32 @foo_call5(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #1 {
%1 = tail call i32 @bar(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #3
ret i32 0
; CHECK-LABEL: foo_call5:
; CHECK: call bar
}
declare i32 @bar(i8 signext, i16 signext, i32, i64) #2
; Function Attrs: nounwind readnone uwtable
define signext i8 @foo_cmp(i8 signext %a, i8 signext %b) #0 {
%1 = icmp slt i8 %a, %b
%a.b = select i1 %1, i8 %a, i8 %b
ret i8 %a.b
; CHECK-LABEL: foo_cmp:
; CHECK: if r2 s> r1
}
; Function Attrs: nounwind readnone uwtable
define i32 @foo_muldiv(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #0 {
%1 = icmp eq i8 %a, 0
br i1 %1, label %5, label %2
; <label>:2 ; preds = %0
%3 = sext i16 %b to i32
%4 = mul nsw i32 %3, %c
br label %8
; <label>:5 ; preds = %0
%6 = trunc i64 %d to i32
%7 = udiv i32 %6, %c
br label %8
; <label>:8 ; preds = %5, %2
%.0 = phi i32 [ %4, %2 ], [ %7, %5 ]
ret i32 %.0
; CHECK-LABEL: foo_muldiv:
; CHECK: r2 *= r3
}
; Function Attrs: nounwind uwtable
define i32 @foo_optimized() #1 {
%1 = tail call i32 @manyarg(i32 1, i32 2, i32 3, i32 4, i32 5) #3
ret i32 %1
; CHECK-LABEL: foo_optimized:
; CHECK: r1 = 1
; CHECK: r2 = 2
; CHECK: r3 = 3
; CHECK: r4 = 4
; CHECK: r5 = 5
}
declare i32 @manyarg(i32, i32, i32, i32, i32) #2
; Function Attrs: nounwind uwtable
define void @foo_printf() #1 {
%fmt = alloca [9 x i8], align 1
%1 = getelementptr inbounds [9 x i8], [9 x i8]* %fmt, i64 0, i64 0
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @foo_printf.fmt, i64 0, i64 0), i64 9, i32 1, i1 false)
; CHECK-LABEL: foo_printf:
; CHECK: r1 = 729618802566522216ll
%2 = call i32 (i8*, ...) @printf(i8* %1) #3
ret void
}
; Function Attrs: nounwind
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) #3
; Function Attrs: nounwind
declare i32 @printf(i8* nocapture, ...) #4