diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:10:56 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:10:56 +0000 |
| commit | 044eb2f6afba375a914ac9d8024f8f5142bb912e (patch) | |
| tree | 1475247dc9f9fe5be155ebd4c9069c75aadf8c20 /test/CodeGen/BPF | |
| parent | eb70dddbd77e120e5d490bd8fbe7ff3f8fa81c6b (diff) | |
Notes
Diffstat (limited to 'test/CodeGen/BPF')
| -rw-r--r-- | test/CodeGen/BPF/cc_args.ll | 6 | ||||
| -rw-r--r-- | test/CodeGen/BPF/cc_args_be.ll | 6 | ||||
| -rw-r--r-- | test/CodeGen/BPF/cc_ret.ll | 4 | ||||
| -rw-r--r-- | test/CodeGen/BPF/dwarfdump.ll | 6 | ||||
| -rw-r--r-- | test/CodeGen/BPF/ex1.ll | 2 | ||||
| -rw-r--r-- | test/CodeGen/BPF/fi_ri.ll | 2 | ||||
| -rw-r--r-- | test/CodeGen/BPF/inline_asm.ll | 54 | ||||
| -rw-r--r-- | test/CodeGen/BPF/intrinsics.ll | 39 | ||||
| -rw-r--r-- | test/CodeGen/BPF/mem_offset_be.ll | 2 | ||||
| -rw-r--r-- | test/CodeGen/BPF/objdump_cond_op.ll | 69 | ||||
| -rw-r--r-- | test/CodeGen/BPF/objdump_cond_op_2.ll | 39 | ||||
| -rw-r--r-- | test/CodeGen/BPF/objdump_intrinsics.ll | 39 | ||||
| -rw-r--r-- | test/CodeGen/BPF/remove_truncate_3.ll | 106 | ||||
| -rw-r--r-- | test/CodeGen/BPF/rodata_1.ll | 4 | ||||
| -rw-r--r-- | test/CodeGen/BPF/rodata_2.ll | 2 | ||||
| -rw-r--r-- | test/CodeGen/BPF/sanity.ll | 4 | ||||
| -rw-r--r-- | test/CodeGen/BPF/select_ri.ll | 4 | ||||
| -rw-r--r-- | test/CodeGen/BPF/setcc.ll | 39 | ||||
| -rw-r--r-- | test/CodeGen/BPF/sockex2.ll | 2 | ||||
| -rw-r--r-- | test/CodeGen/BPF/undef.ll | 52 | ||||
| -rw-r--r-- | test/CodeGen/BPF/warn-call.ll | 3 |
21 files changed, 392 insertions, 92 deletions
diff --git a/test/CodeGen/BPF/cc_args.ll b/test/CodeGen/BPF/cc_args.ll index a2ac03f0da12..020992a9fd51 100644 --- a/test/CodeGen/BPF/cc_args.ll +++ b/test/CodeGen/BPF/cc_args.ll @@ -1,4 +1,4 @@ -; RUN: not llc < %s -march=bpfel -show-mc-encoding | FileCheck %s +; RUN: llc < %s -march=bpfel -show-mc-encoding | FileCheck %s define void @test() #0 { entry: @@ -12,7 +12,7 @@ entry: ; CHECK: call f_i32 call void @f_i32(i32 12345678) -; CHECK: r1 = 72623859790382856ll # encoding: [0x18,0x01,0x00,0x00,0x08,0x07,0x06,0x05,0x00,0x00,0x00,0x00,0x04,0x03,0x02,0x01] +; CHECK: r1 = 72623859790382856 ll # encoding: [0x18,0x01,0x00,0x00,0x08,0x07,0x06,0x05,0x00,0x00,0x00,0x00,0x04,0x03,0x02,0x01] ; CHECK: call f_i64 call void @f_i64(i64 72623859790382856) @@ -28,7 +28,7 @@ entry: call void @f_i16_i32_i16(i16 2, i32 3, i16 4) ; CHECK: r1 = 5 -; CHECK: r2 = 7262385979038285ll +; CHECK: r2 = 7262385979038285 ll ; CHECK: r3 = 6 ; CHECK: call f_i16_i64_i16 call void @f_i16_i64_i16(i16 5, i64 7262385979038285, i16 6) diff --git a/test/CodeGen/BPF/cc_args_be.ll b/test/CodeGen/BPF/cc_args_be.ll index dc41ee0d8a7d..469556f6c78d 100644 --- a/test/CodeGen/BPF/cc_args_be.ll +++ b/test/CodeGen/BPF/cc_args_be.ll @@ -1,4 +1,4 @@ -; RUN: not llc < %s -march=bpfeb -show-mc-encoding | FileCheck %s +; RUN: llc < %s -march=bpfeb -show-mc-encoding | FileCheck %s ; test big endian define void @test() #0 { @@ -13,7 +13,7 @@ entry: ; CHECK: call f_i32 call void @f_i32(i32 12345678) -; CHECK: r1 = 72623859790382856ll # encoding: [0x18,0x10,0x00,0x00,0x05,0x06,0x07,0x08,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04] +; CHECK: r1 = 72623859790382856 ll # encoding: [0x18,0x10,0x00,0x00,0x05,0x06,0x07,0x08,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04] ; CHECK: call f_i64 call void @f_i64(i64 72623859790382856) @@ -29,7 +29,7 @@ entry: call void @f_i16_i32_i16(i16 2, i32 3, i16 4) ; CHECK: r1 = 5 -; CHECK: r2 = 7262385979038285ll +; CHECK: r2 = 7262385979038285 ll ; CHECK: r3 = 6 ; CHECK: call f_i16_i64_i16 call void @f_i16_i64_i16(i16 5, i64 7262385979038285, i16 6) diff --git a/test/CodeGen/BPF/cc_ret.ll b/test/CodeGen/BPF/cc_ret.ll index eab2a359b8f2..73e3556c63ed 100644 --- a/test/CodeGen/BPF/cc_ret.ll +++ b/test/CodeGen/BPF/cc_ret.ll @@ -1,4 +1,4 @@ -; RUN: not llc < %s -march=bpfel | FileCheck %s +; RUN: llc < %s -march=bpfel | FileCheck %s define void @test() #0 { entry: @@ -42,7 +42,7 @@ define i32 @f_i32() #0 { define i64 @f_i64() #0 { ; CHECK: f_i64: -; CHECK: r0 = 72623859790382856ll +; CHECK: r0 = 72623859790382856 ll ; CHECK: exit ret i64 72623859790382856 } diff --git a/test/CodeGen/BPF/dwarfdump.ll b/test/CodeGen/BPF/dwarfdump.ll index 6a6913011e64..702cb28423fb 100644 --- a/test/CodeGen/BPF/dwarfdump.ll +++ b/test/CodeGen/BPF/dwarfdump.ll @@ -1,7 +1,7 @@ ; RUN: llc -O2 -march=bpfel %s -o %t -filetype=obj -; RUN: llvm-dwarfdump -debug-dump=line %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-line %t | FileCheck %s ; RUN: llc -O2 -march=bpfeb %s -o %t -filetype=obj -; RUN: llvm-dwarfdump -debug-dump=line %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-line %t | FileCheck %s source_filename = "testprog.c" target datalayout = "e-m:e-p:64:64-i64:64-n32:64-S128" @@ -30,7 +30,7 @@ attributes #1 = { nounwind readnone } !llvm.module.flags = !{!13, !14} !llvm.ident = !{!15} -!0 = distinct !DIGlobalVariableExpression(var: !1) +!0 = distinct !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) !1 = !DIGlobalVariable(name: "myvar_c", scope: !2, file: !3, line: 3, type: !6, isLocal: true, isDefinition: true) !2 = distinct !DISubprogram(name: "testprog", scope: !3, file: !3, line: 1, type: !4, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: true, unit: !7, variables: !10) !3 = !DIFile(filename: "testprog.c", directory: "/w/llvm/bld") diff --git a/test/CodeGen/BPF/ex1.ll b/test/CodeGen/BPF/ex1.ll index 2f77884f5ef0..97cc7e07ab9b 100644 --- a/test/CodeGen/BPF/ex1.ll +++ b/test/CodeGen/BPF/ex1.ll @@ -32,7 +32,7 @@ define i32 @bpf_prog1(%struct.bpf_context* nocapture %ctx) #0 section "events/ne ; CHECK: call 9 ; CHECK: if r0 != 0 ; CHECK: r1 = 622884453 -; CHECK: r1 = 7214898703899978611ll +; CHECK: r1 = 7214898703899978611 ll ; CHECK: call 11 ; CHECK: r0 = 0 ; CHECK: exit diff --git a/test/CodeGen/BPF/fi_ri.ll b/test/CodeGen/BPF/fi_ri.ll index 6ecc82679691..12452988e8a9 100644 --- a/test/CodeGen/BPF/fi_ri.ll +++ b/test/CodeGen/BPF/fi_ri.ll @@ -1,4 +1,4 @@ -; RUN: not llc < %s -march=bpf | FileCheck %s +; RUN: llc < %s -march=bpf | FileCheck %s %struct.key_t = type { i32, [16 x i8] } diff --git a/test/CodeGen/BPF/inline_asm.ll b/test/CodeGen/BPF/inline_asm.ll new file mode 100644 index 000000000000..7822ac49ed89 --- /dev/null +++ b/test/CodeGen/BPF/inline_asm.ll @@ -0,0 +1,54 @@ +; RUN: llc < %s -march=bpfel -verify-machineinstrs | FileCheck %s +; RUN: llc < %s -march=bpfeb -verify-machineinstrs | FileCheck %s + +; Source code: +; int g[2]; +; +; int test(void *ctx) { +; int a = 4, b; +; unsigned long long c = 333333333333ULL; +; asm volatile("r0 = *(u16 *)skb[%0]" : : "i"(2)); +; asm volatile("r0 = *(u16 *)skb[%0]" : : "r"(a)); +; asm volatile("%0 = %1" : "=r"(b) : "i"(4)); +; asm volatile("%0 = %1 ll" : "=r"(b) : "i"(c)); +; asm volatile("%0 = *(u16 *) %1" : "=r"(b) : "m"(a)); +; asm volatile("%0 = *(u32 *) %1" : "=r"(b) : "m"(g[1])); +; return b; +; } +; + +@g = common global [2 x i32] zeroinitializer, align 4 + +; Function Attrs: nounwind +define i32 @test(i8* nocapture readnone %ctx) local_unnamed_addr #0 { +entry: + %a = alloca i32, align 4 + %0 = bitcast i32* %a to i8* + call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0) #2 + store i32 4, i32* %a, align 4 + tail call void asm sideeffect "r0 = *(u16 *)skb[$0]", "i"(i32 2) #2 +; CHECK: r0 = *(u16 *)skb[2] + tail call void asm sideeffect "r0 = *(u16 *)skb[$0]", "r"(i32 4) #2 +; CHECK: r0 = *(u16 *)skb[r1] + %1 = tail call i32 asm sideeffect "$0 = $1", "=r,i"(i32 4) #2 +; CHECK: r1 = 4 + %2 = tail call i32 asm sideeffect "$0 = $1 ll", "=r,i"(i64 333333333333) #2 +; CHECK: r1 = 333333333333 ll + %3 = call i32 asm sideeffect "$0 = *(u16 *) $1", "=r,*m"(i32* nonnull %a) #2 +; CHECK: r1 = *(u16 *) (r10 - 4) + %4 = call i32 asm sideeffect "$0 = *(u32 *) $1", "=r,*m"(i32* getelementptr inbounds ([2 x i32], [2 x i32]* @g, i64 0, i64 1)) #2 +; CHECK: r1 = g ll +; CHECK: r0 = *(u32 *) (r1 + 4) + call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0) #2 + ret i32 %4 +} + +; Function Attrs: argmemonly nounwind +declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #1 + +; Function Attrs: argmemonly nounwind +declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1 + +attributes #0 = { nounwind } +attributes #1 = { argmemonly nounwind } +attributes #2 = { nounwind } diff --git a/test/CodeGen/BPF/intrinsics.ll b/test/CodeGen/BPF/intrinsics.ll index 88aba805adad..28aba0097d3d 100644 --- a/test/CodeGen/BPF/intrinsics.ll +++ b/test/CodeGen/BPF/intrinsics.ll @@ -1,4 +1,5 @@ -; RUN: llc < %s -march=bpfel -show-mc-encoding | FileCheck %s +; RUN: llc < %s -march=bpfel -show-mc-encoding | FileCheck --check-prefix=CHECK-EL %s +; RUN: llc < %s -march=bpfeb -show-mc-encoding | FileCheck --check-prefix=CHECK-EB %s ; Function Attrs: nounwind uwtable define i32 @ld_b(i64 %foo, i64* nocapture %bar, i8* %ctx, i8* %ctx2) #0 { @@ -13,8 +14,10 @@ define i32 @ld_b(i64 %foo, i64* nocapture %bar, i8* %ctx, i8* %ctx2) #0 { %9 = trunc i64 %8 to i32 ret i32 %9 ; CHECK-LABEL: ld_b: -; CHECK: r0 = *(u8 *)skb[123] -; CHECK: r0 = *(u8 *)skb[r +; CHECK-EL: r0 = *(u8 *)skb[123] +; CHECK-EL: r0 = *(u8 *)skb[r +; CHECK-EB: r0 = *(u8 *)skb[123] +; CHECK-EB: r0 = *(u8 *)skb[r } declare i64 @llvm.bpf.load.byte(i8*, i64) #1 @@ -28,8 +31,10 @@ define i32 @ld_h(i8* %ctx, i8* %ctx2, i32 %foo) #0 { %5 = trunc i64 %4 to i32 ret i32 %5 ; CHECK-LABEL: ld_h: -; CHECK: r0 = *(u16 *)skb[r -; CHECK: r0 = *(u16 *)skb[123] +; CHECK-EL: r0 = *(u16 *)skb[r +; CHECK-EL: r0 = *(u16 *)skb[123] +; CHECK-EB: r0 = *(u16 *)skb[r +; CHECK-EB: r0 = *(u16 *)skb[123] } declare i64 @llvm.bpf.load.half(i8*, i64) #1 @@ -43,8 +48,10 @@ define i32 @ld_w(i8* %ctx, i8* %ctx2, i32 %foo) #0 { %5 = trunc i64 %4 to i32 ret i32 %5 ; CHECK-LABEL: ld_w: -; CHECK: r0 = *(u32 *)skb[r -; CHECK: r0 = *(u32 *)skb[123] +; CHECK-EL: r0 = *(u32 *)skb[r +; CHECK-EL: r0 = *(u32 *)skb[123] +; CHECK-EB: r0 = *(u32 *)skb[r +; CHECK-EB: r0 = *(u32 *)skb[123] } declare i64 @llvm.bpf.load.word(i8*, i64) #1 @@ -55,7 +62,8 @@ entry: tail call void inttoptr (i64 4 to void (i64, i32)*)(i64 %call, i32 4) #2 ret i32 0 ; CHECK-LABEL: ld_pseudo: -; CHECK: ld_pseudo r1, 2, 3 # encoding: [0x18,0x21,0x00,0x00,0x03,0x00 +; CHECK-EL: ld_pseudo r1, 2, 3 # encoding: [0x18,0x21,0x00,0x00,0x03,0x00,0x00,0x00 +; CHECK-EB: ld_pseudo r1, 2, 3 # encoding: [0x18,0x12,0x00,0x00,0x00,0x00,0x00,0x03 } declare i64 @llvm.bpf.pseudo(i64, i64) #2 @@ -74,11 +82,16 @@ entry: %conv5 = trunc i64 %add4 to i32 ret i32 %conv5 ; CHECK-LABEL: bswap: -; CHECK: bswap64 r1 # encoding: [0xdc,0x01,0x00,0x00,0x40,0x00,0x00,0x00] -; CHECK: bswap32 r2 # encoding: [0xdc,0x02,0x00,0x00,0x20,0x00,0x00,0x00] -; CHECK: r2 += r1 # encoding: [0x0f,0x12,0x00,0x00,0x00,0x00,0x00,0x00] -; CHECK: bswap16 r3 # encoding: [0xdc,0x03,0x00,0x00,0x10,0x00,0x00,0x00] -; CHECK: r2 += r3 # encoding: [0x0f,0x32,0x00,0x00,0x00,0x00,0x00,0x00] +; CHECK-EL: r1 = be64 r1 # encoding: [0xdc,0x01,0x00,0x00,0x40,0x00,0x00,0x00] +; CHECK-EL: r2 = be32 r2 # encoding: [0xdc,0x02,0x00,0x00,0x20,0x00,0x00,0x00] +; CHECK-EL: r2 += r1 # encoding: [0x0f,0x12,0x00,0x00,0x00,0x00,0x00,0x00] +; CHECK-EL: r3 = be16 r3 # encoding: [0xdc,0x03,0x00,0x00,0x10,0x00,0x00,0x00] +; CHECK-EL: r2 += r3 # encoding: [0x0f,0x32,0x00,0x00,0x00,0x00,0x00,0x00] +; CHECK-EB: r1 = le64 r1 # encoding: [0xd4,0x10,0x00,0x00,0x00,0x00,0x00,0x40] +; CHECK-EB: r2 = le32 r2 # encoding: [0xd4,0x20,0x00,0x00,0x00,0x00,0x00,0x20] +; CHECK-EB: r2 += r1 # encoding: [0x0f,0x21,0x00,0x00,0x00,0x00,0x00,0x00] +; CHECK-EB: r3 = le16 r3 # encoding: [0xd4,0x30,0x00,0x00,0x00,0x00,0x00,0x10] +; CHECK-EB: r2 += r3 # encoding: [0x0f,0x23,0x00,0x00,0x00,0x00,0x00,0x00] } declare i64 @llvm.bswap.i64(i64) #1 diff --git a/test/CodeGen/BPF/mem_offset_be.ll b/test/CodeGen/BPF/mem_offset_be.ll index e5e352783d70..7d7243a6667c 100644 --- a/test/CodeGen/BPF/mem_offset_be.ll +++ b/test/CodeGen/BPF/mem_offset_be.ll @@ -2,7 +2,7 @@ ; Function Attrs: nounwind define i32 @bpf_prog1(i8* nocapture readnone) local_unnamed_addr #0 { -; CHECK: r1 = 590618314553ll # encoding: [0x18,0x10,0x00,0x00,0x83,0x98,0x47,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89] +; CHECK: r1 = 590618314553 ll # encoding: [0x18,0x10,0x00,0x00,0x83,0x98,0x47,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89] ; CHECK: r1 += -1879113726 # encoding: [0x07,0x10,0x00,0x00,0x8f,0xff,0x00,0x02] ; CHECK: r0 = *(u64 *)(r1 + 0) # encoding: [0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x00] %2 = alloca i64, align 8 diff --git a/test/CodeGen/BPF/objdump_cond_op.ll b/test/CodeGen/BPF/objdump_cond_op.ll new file mode 100644 index 000000000000..b9dc122fe209 --- /dev/null +++ b/test/CodeGen/BPF/objdump_cond_op.ll @@ -0,0 +1,69 @@ +; RUN: llc -march=bpfel -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s + +; Source Code: +; int gbl; +; int test(int a, int b) { +; if (a == 2) { +; gbl = gbl * gbl * 2; +; goto out; +; } +; if (a != b) { +; gbl = gbl * 4; +; } +; out: +; return gbl; +; } + +@gbl = common local_unnamed_addr global i32 0, align 4 + +define i32 @test(i32, i32) local_unnamed_addr #0 { + %3 = icmp eq i32 %0, 2 + br i1 %3, label %4, label %8 + +; <label>:4: ; preds = %2 + %5 = load i32, i32* @gbl, align 4 + %6 = shl i32 %5, 1 + %7 = mul i32 %6, %5 + br label %13 +; CHECK: r1 <<= 32 +; CHECK: r1 >>= 32 +; CHECK: if r1 != 2 goto +6 <LBB0_2> + +; <label>:8: ; preds = %2 + %9 = icmp eq i32 %0, %1 + %10 = load i32, i32* @gbl, align 4 + br i1 %9, label %15, label %11 + +; CHECK: r1 = 0 ll +; CHECK: r0 = *(u32 *)(r1 + 0) +; CHECK: r0 *= r0 +; CHECK: r0 <<= 1 +; CHECK: goto +7 <LBB0_4> + +; <label>:11: ; preds = %8 + %12 = shl nsw i32 %10, 2 + br label %13 + +; CHECK-LABEL: LBB0_2: +; CHECK: r3 = 0 ll +; CHECK: r0 = *(u32 *)(r3 + 0) +; CHECK: r2 <<= 32 +; CHECK: r2 >>= 32 +; CHECK: if r1 == r2 goto +4 <LBB0_5> +; CHECK: r0 <<= 2 + +; <label>:13: ; preds = %4, %11 + %14 = phi i32 [ %12, %11 ], [ %7, %4 ] + store i32 %14, i32* @gbl, align 4 + br label %15 +; CHECK-LABEL: LBB0_4: +; CHECK: r1 = 0 ll +; CHECK: *(u32 *)(r1 + 0) = r0 + +; <label>:15: ; preds = %8, %13 + %16 = phi i32 [ %14, %13 ], [ %10, %8 ] + ret i32 %16 +; CHECK-LABEL: LBB0_5: +; CHECK: exit +} +attributes #0 = { norecurse nounwind } diff --git a/test/CodeGen/BPF/objdump_cond_op_2.ll b/test/CodeGen/BPF/objdump_cond_op_2.ll new file mode 100644 index 000000000000..618fb6ce1870 --- /dev/null +++ b/test/CodeGen/BPF/objdump_cond_op_2.ll @@ -0,0 +1,39 @@ +; RUN: llc -march=bpfel -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s + +; Source Code: +; int test(int a, int b) { +; int s = 0; +; while (a < b) { s++; a += s; b -= s; } +; return s; +; } + +define i32 @test(i32, i32) local_unnamed_addr #0 { +; CHECK-LABEL: test: + %3 = icmp slt i32 %0, %1 + br i1 %3, label %4, label %13 + +; <label>:4: ; preds = %2 + br label %5 +; CHECK: if r4 s>= r3 goto +11 <LBB0_3> +; CHECK: r0 = 0 +; CHECK-LABEL: LBB0_2: + +; <label>:5: ; preds = %4, %5 + %6 = phi i32 [ %9, %5 ], [ 0, %4 ] + %7 = phi i32 [ %11, %5 ], [ %1, %4 ] + %8 = phi i32 [ %10, %5 ], [ %0, %4 ] + %9 = add nuw nsw i32 %6, 1 + %10 = add nsw i32 %9, %8 + %11 = sub nsw i32 %7, %9 + %12 = icmp slt i32 %10, %11 + br i1 %12, label %5, label %13 +; CHECK: r1 = r3 +; CHECK: if r2 s> r3 goto -10 <LBB0_2> + +; <label>:13: ; preds = %5, %2 + %14 = phi i32 [ 0, %2 ], [ %9, %5 ] + ret i32 %14 +; CHECK-LABEL: LBB0_3: +; CHECK: exit +} +attributes #0 = { norecurse nounwind readnone } diff --git a/test/CodeGen/BPF/objdump_intrinsics.ll b/test/CodeGen/BPF/objdump_intrinsics.ll index 1d33e57de789..6a32da9ec043 100644 --- a/test/CodeGen/BPF/objdump_intrinsics.ll +++ b/test/CodeGen/BPF/objdump_intrinsics.ll @@ -1,4 +1,5 @@ -; RUN: llc -march=bpfel -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s +; RUN: llc -march=bpfel -filetype=obj -o - %s | llvm-objdump -d - | FileCheck --check-prefix=CHECK-EL %s +; RUN: llc -march=bpfeb -filetype=obj -o - %s | llvm-objdump -d - | FileCheck --check-prefix=CHECK-EB %s ; Function Attrs: nounwind uwtable define i32 @ld_b(i64 %foo, i64* nocapture %bar, i8* %ctx, i8* %ctx2) #0 { @@ -13,8 +14,10 @@ define i32 @ld_b(i64 %foo, i64* nocapture %bar, i8* %ctx, i8* %ctx2) #0 { %9 = trunc i64 %8 to i32 ret i32 %9 ; CHECK-LABEL: ld_b: -; CHECK: r0 = *(u8 *)skb[123] -; CHECK: r0 = *(u8 *)skb[r +; CHECK-EL: r0 = *(u8 *)skb[123] +; CHECK-EL: r0 = *(u8 *)skb[r +; CHECK-EB: r0 = *(u8 *)skb[123] +; CHECK-EB: r0 = *(u8 *)skb[r } declare i64 @llvm.bpf.load.byte(i8*, i64) #1 @@ -28,8 +31,10 @@ define i32 @ld_h(i8* %ctx, i8* %ctx2, i32 %foo) #0 { %5 = trunc i64 %4 to i32 ret i32 %5 ; CHECK-LABEL: ld_h: -; CHECK: r0 = *(u16 *)skb[r -; CHECK: r0 = *(u16 *)skb[123] +; CHECK-EL: r0 = *(u16 *)skb[r +; CHECK-EL: r0 = *(u16 *)skb[123] +; CHECK-EB: r0 = *(u16 *)skb[r +; CHECK-EB: r0 = *(u16 *)skb[123] } declare i64 @llvm.bpf.load.half(i8*, i64) #1 @@ -43,8 +48,10 @@ define i32 @ld_w(i8* %ctx, i8* %ctx2, i32 %foo) #0 { %5 = trunc i64 %4 to i32 ret i32 %5 ; CHECK-LABEL: ld_w: -; CHECK: r0 = *(u32 *)skb[r -; CHECK: r0 = *(u32 *)skb[123] +; CHECK-EL: r0 = *(u32 *)skb[r +; CHECK-EL: r0 = *(u32 *)skb[123] +; CHECK-EB: r0 = *(u32 *)skb[r +; CHECK-EB: r0 = *(u32 *)skb[123] } declare i64 @llvm.bpf.load.word(i8*, i64) #1 @@ -55,7 +62,8 @@ entry: tail call void inttoptr (i64 4 to void (i64, i32)*)(i64 %call, i32 4) #2 ret i32 0 ; CHECK-LABEL: ld_pseudo: -; CHECK: ld_pseudo r1, 2, 3 +; CHECK-EL: ld_pseudo r1, 2, 3 +; CHECK-EB: ld_pseudo r1, 2, 3 } declare i64 @llvm.bpf.pseudo(i64, i64) #2 @@ -74,11 +82,16 @@ entry: %conv5 = trunc i64 %add4 to i32 ret i32 %conv5 ; CHECK-LABEL: bswap: -; CHECK: bswap64 r1 -; CHECK: bswap32 r2 -; CHECK: r2 += r1 -; CHECK: bswap16 r3 -; CHECK: r2 += r3 +; CHECK-EL: r1 = be64 r1 +; CHECK-EL: r2 = be32 r2 +; CHECK-EL: r2 += r1 +; CHECK-EL: r3 = be16 r3 +; CHECK-EL: r2 += r3 +; CHECK-EB: r1 = le64 r1 +; CHECK-EB: r2 = le32 r2 +; CHECK-EB: r2 += r1 +; CHECK-EB: r3 = le16 r3 +; CHECK-EB: r2 += r3 } declare i64 @llvm.bswap.i64(i64) #1 diff --git a/test/CodeGen/BPF/remove_truncate_3.ll b/test/CodeGen/BPF/remove_truncate_3.ll new file mode 100644 index 000000000000..4e58b5e2d07b --- /dev/null +++ b/test/CodeGen/BPF/remove_truncate_3.ll @@ -0,0 +1,106 @@ +; RUN: llc < %s -march=bpf -verify-machineinstrs | FileCheck %s + +; Source code: +; struct xdp_md { +; unsigned data; +; unsigned data_end; +; }; +; +; int gbl; +; int xdp_dummy(struct xdp_md *xdp) +; { +; char tmp; +; long addr; +; +; if (gbl) { +; long addr1 = (long)xdp->data; +; tmp = *(char *)addr1; +; if (tmp == 1) +; return 3; +; } else { +; tmp = *(volatile char *)(long)xdp->data_end; +; if (tmp == 1) +; return 2; +; } +; addr = (long)xdp->data; +; tmp = *(volatile char *)addr; +; if (tmp == 0) +; return 1; +; return 0; +; } +; +; unsigned int rol32(unsigned int word, unsigned int shift) +; { +; return (word << shift) | (word >> ((-shift) & 31)); +; } +%struct.xdp_md = type { i32, i32 } + +@gbl = common local_unnamed_addr global i32 0, align 4 + +; Function Attrs: norecurse nounwind +define i32 @xdp_dummy(%struct.xdp_md* nocapture readonly) local_unnamed_addr #0 { + %2 = load i32, i32* @gbl, align 4 + %3 = icmp eq i32 %2, 0 + br i1 %3, label %11, label %4 + +; <label>:4: ; preds = %1 + %5 = getelementptr inbounds %struct.xdp_md, %struct.xdp_md* %0, i64 0, i32 0 + %6 = load i32, i32* %5, align 4 + %7 = zext i32 %6 to i64 + %8 = inttoptr i64 %7 to i8* + %9 = load i8, i8* %8, align 1 + %10 = icmp eq i8 %9, 1 + br i1 %10, label %28, label %23 +; CHECK: r1 = *(u32 *)(r1 + 0) +; CHECK: r2 = *(u8 *)(r1 + 0) + +; <label>:11: ; preds = %1 + %12 = getelementptr inbounds %struct.xdp_md, %struct.xdp_md* %0, i64 0, i32 1 + %13 = load i32, i32* %12, align 4 + %14 = zext i32 %13 to i64 +; CHECK: r2 = *(u32 *)(r1 + 4) + %15 = inttoptr i64 %14 to i8* + %16 = load volatile i8, i8* %15, align 1 +; CHECK: r2 = *(u8 *)(r2 + 0) + %17 = icmp eq i8 %16, 1 + br i1 %17, label %28, label %18 + +; <label>:18: ; preds = %11 + %19 = getelementptr inbounds %struct.xdp_md, %struct.xdp_md* %0, i64 0, i32 0 + %20 = load i32, i32* %19, align 4 + %21 = zext i32 %20 to i64 + %22 = inttoptr i64 %21 to i8* + br label %23 +; CHECK: r1 = *(u32 *)(r1 + 0) + +; <label>:23: ; preds = %18, %4 + %24 = phi i8* [ %22, %18 ], [ %8, %4 ] +; CHECK-NOT: r1 <<= 32 +; CHECK-NOT: r1 >>= 32 + %25 = load volatile i8, i8* %24, align 1 +; CHECK: r1 = *(u8 *)(r1 + 0) + %26 = icmp eq i8 %25, 0 + %27 = zext i1 %26 to i32 + br label %28 + +; <label>:28: ; preds = %4, %23, %11 + %29 = phi i32 [ 3, %4 ], [ 2, %11 ], [ %27, %23 ] + ret i32 %29 +} + +; Function Attrs: norecurse nounwind readnone +define i32 @rol32(i32, i32) local_unnamed_addr #1 { + %3 = shl i32 %0, %1 +; CHECK: r3 <<= 32 +; CHECK: r3 >>= 32 + %4 = sub i32 0, %1 + %5 = and i32 %4, 31 + %6 = lshr i32 %0, %5 +; CHECK: r1 <<= 32 +; CHECK: r1 >>= 32 + %7 = or i32 %6, %3 + ret i32 %7 +} + +attributes #0 = { norecurse nounwind } +attributes #1 = { norecurse nounwind readnone } diff --git a/test/CodeGen/BPF/rodata_1.ll b/test/CodeGen/BPF/rodata_1.ll index 5566f76bb75c..9aa9e8c57805 100644 --- a/test/CodeGen/BPF/rodata_1.ll +++ b/test/CodeGen/BPF/rodata_1.ll @@ -35,12 +35,12 @@ define i32 @test() local_unnamed_addr #0 { entry: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* getelementptr inbounds (%struct.test_t1, %struct.test_t1* @g1, i64 0, i32 0), i8* getelementptr inbounds (%struct.test_t1, %struct.test_t1* @test.t1, i64 0, i32 0), i64 3, i32 1, i1 false) tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (%struct.test_t2* @g2 to i8*), i8* bitcast (%struct.test_t2* @test.t2 to i8*), i64 20, i32 4, i1 false) -; CHECK: r1 = <MCOperand Expr:(g1)>ll +; CHECK: r1 = g1 ; CHECK: r2 = 0 ; CHECK: *(u8 *)(r1 + 1) = r2 ; CHECK: r3 = 1 ; CHECK: *(u8 *)(r1 + 2) = r3 -; CHECK: r1 = <MCOperand Expr:(g2)>ll +; CHECK: r1 = g2 ; CHECK: *(u32 *)(r1 + 8) = r3 ret i32 0 } diff --git a/test/CodeGen/BPF/rodata_2.ll b/test/CodeGen/BPF/rodata_2.ll index 74b3c3640c3f..86b80118bc13 100644 --- a/test/CodeGen/BPF/rodata_2.ll +++ b/test/CodeGen/BPF/rodata_2.ll @@ -32,7 +32,7 @@ define i32 @test() local_unnamed_addr #0 { entry: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* getelementptr inbounds (%struct.test_t2, %struct.test_t2* @g, i64 0, i32 0), i8* getelementptr inbounds (%struct.test_t2, %struct.test_t2* @test.t2, i64 0, i32 0), i64 32, i32 4, i1 false) -; CHECK: r1 = <MCOperand Expr:(g)>ll +; CHECK: r1 = g ; CHECK: r2 = 0 ; CHECK: *(u32 *)(r1 + 28) = r2 ; CHECK: r3 = 3 diff --git a/test/CodeGen/BPF/sanity.ll b/test/CodeGen/BPF/sanity.ll index a7aed65b821e..33cfc2fb0307 100644 --- a/test/CodeGen/BPF/sanity.ll +++ b/test/CodeGen/BPF/sanity.ll @@ -1,4 +1,4 @@ -; RUN: not llc < %s -march=bpfel | FileCheck %s +; RUN: llc < %s -march=bpfel | FileCheck %s @foo_printf.fmt = private unnamed_addr constant [9 x i8] c"hello \0A\00", align 1 @@ -105,7 +105,7 @@ define void @foo_printf() #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 +; CHECK: r1 = 729618802566522216 ll %2 = call i32 (i8*, ...) @printf(i8* %1) #3 ret void } diff --git a/test/CodeGen/BPF/select_ri.ll b/test/CodeGen/BPF/select_ri.ll index 3610d4016010..7b1f852ca796 100644 --- a/test/CodeGen/BPF/select_ri.ll +++ b/test/CodeGen/BPF/select_ri.ll @@ -18,7 +18,7 @@ entry: %tobool = icmp eq i32 %0, 0 %1 = load i32, i32* @c, align 4 %. = select i1 %tobool, i32 0, i32 %1 -; CHECK: r1 = <MCOperand Expr:(b)>ll +; CHECK: r1 = b ; CHECK: r1 = *(u32 *)(r1 + 0) ; CHECK: if r1 == 0 goto ret i32 %. @@ -53,7 +53,7 @@ define i32 @foo(i8*) local_unnamed_addr #0 { %3 = tail call i64 @llvm.bpf.load.word(i8* %0, i64 104) %4 = add i64 %3, %2 %5 = icmp ne i64 %4, 8589934591 -; CHECK: r{{[0-9]+}} = 8589934591ll +; CHECK: r{{[0-9]+}} = 8589934591 ll %6 = sext i1 %5 to i32 ret i32 %6 } diff --git a/test/CodeGen/BPF/setcc.ll b/test/CodeGen/BPF/setcc.ll index 7e20814da807..d82a76237a14 100644 --- a/test/CodeGen/BPF/setcc.ll +++ b/test/CodeGen/BPF/setcc.ll @@ -1,4 +1,5 @@ -; RUN: llc -march=bpfel < %s | FileCheck %s +; RUN: llc -march=bpfel < %s | FileCheck --check-prefix=CHECK-V1 %s +; RUN: llc -march=bpfel -mcpu=v2 < %s | FileCheck --check-prefix=CHECK-V2 %s define i16 @sccweqand(i16 %a, i16 %b) nounwind { %t1 = and i16 %a, %b @@ -7,7 +8,8 @@ define i16 @sccweqand(i16 %a, i16 %b) nounwind { ret i16 %t3 } ; CHECK-LABEL: sccweqand: -; CHECK: if r1 == 0 +; CHECK-V1: if r1 == 0 +; CHECK-V2: if r1 == 0 define i16 @sccwneand(i16 %a, i16 %b) nounwind { %t1 = and i16 %a, %b @@ -16,7 +18,8 @@ define i16 @sccwneand(i16 %a, i16 %b) nounwind { ret i16 %t3 } ; CHECK-LABEL: sccwneand: -; CHECK: if r1 != 0 +; CHECK-V1: if r1 != 0 +; CHECK-V2: if r1 != 0 define i16 @sccwne(i16 %a, i16 %b) nounwind { %t1 = icmp ne i16 %a, %b @@ -24,7 +27,8 @@ define i16 @sccwne(i16 %a, i16 %b) nounwind { ret i16 %t2 } ; CHECK-LABEL:sccwne: -; CHECK: if r1 != r2 +; CHECK-V1: if r1 != r2 +; CHECK-V2: if r1 != r2 define i16 @sccweq(i16 %a, i16 %b) nounwind { %t1 = icmp eq i16 %a, %b @@ -32,7 +36,8 @@ define i16 @sccweq(i16 %a, i16 %b) nounwind { ret i16 %t2 } ; CHECK-LABEL:sccweq: -; CHECK: if r1 == r2 +; CHECK-V1: if r1 == r2 +; CHECK-V2: if r1 == r2 define i16 @sccwugt(i16 %a, i16 %b) nounwind { %t1 = icmp ugt i16 %a, %b @@ -40,7 +45,8 @@ define i16 @sccwugt(i16 %a, i16 %b) nounwind { ret i16 %t2 } ; CHECK-LABEL:sccwugt: -; CHECK: if r1 > r2 +; CHECK-V1: if r1 > r2 +; CHECK-V2: if r1 > r2 define i16 @sccwuge(i16 %a, i16 %b) nounwind { %t1 = icmp uge i16 %a, %b @@ -48,7 +54,8 @@ define i16 @sccwuge(i16 %a, i16 %b) nounwind { ret i16 %t2 } ; CHECK-LABEL:sccwuge: -; CHECK: if r1 >= r2 +; CHECK-V1: if r1 >= r2 +; CHECK-V2: if r1 >= r2 define i16 @sccwult(i16 %a, i16 %b) nounwind { %t1 = icmp ult i16 %a, %b @@ -56,7 +63,8 @@ define i16 @sccwult(i16 %a, i16 %b) nounwind { ret i16 %t2 } ; CHECK-LABEL:sccwult: -; CHECK: if r2 > r1 +; CHECK-V1: if r2 > r1 +; CHECK-V2: if r1 < r2 define i16 @sccwule(i16 %a, i16 %b) nounwind { %t1 = icmp ule i16 %a, %b @@ -64,7 +72,8 @@ define i16 @sccwule(i16 %a, i16 %b) nounwind { ret i16 %t2 } ; CHECK-LABEL:sccwule: -; CHECK: if r2 >= r1 +; CHECK-V1: if r2 >= r1 +; CHECK-V2: if r1 <= r2 define i16 @sccwsgt(i16 %a, i16 %b) nounwind { %t1 = icmp sgt i16 %a, %b @@ -72,7 +81,8 @@ define i16 @sccwsgt(i16 %a, i16 %b) nounwind { ret i16 %t2 } ; CHECK-LABEL:sccwsgt: -; CHECK: if r1 s> r2 +; CHECK-V1: if r1 s> r2 +; CHECK-V2: if r1 s> r2 define i16 @sccwsge(i16 %a, i16 %b) nounwind { %t1 = icmp sge i16 %a, %b @@ -80,7 +90,8 @@ define i16 @sccwsge(i16 %a, i16 %b) nounwind { ret i16 %t2 } ; CHECK-LABEL:sccwsge: -; CHECK: if r1 s>= r2 +; CHECK-V1: if r1 s>= r2 +; CHECK-V2: if r1 s>= r2 define i16 @sccwslt(i16 %a, i16 %b) nounwind { %t1 = icmp slt i16 %a, %b @@ -88,7 +99,8 @@ define i16 @sccwslt(i16 %a, i16 %b) nounwind { ret i16 %t2 } ; CHECK-LABEL:sccwslt: -; CHECK: if r2 s> r1 +; CHECK-V1: if r2 s> r1 +; CHECK-V2: if r1 s< r2 define i16 @sccwsle(i16 %a, i16 %b) nounwind { %t1 = icmp sle i16 %a, %b @@ -96,4 +108,5 @@ define i16 @sccwsle(i16 %a, i16 %b) nounwind { ret i16 %t2 } ; CHECK-LABEL:sccwsle: -; CHECK: if r2 s>= r1 +; CHECK-V1: if r2 s>= r1 +; CHECK-V2: if r1 s<= r2 diff --git a/test/CodeGen/BPF/sockex2.ll b/test/CodeGen/BPF/sockex2.ll index d5f070ea605c..f3f3e450edcd 100644 --- a/test/CodeGen/BPF/sockex2.ll +++ b/test/CodeGen/BPF/sockex2.ll @@ -311,7 +311,7 @@ flow_dissector.exit.thread: ; preds = %86, %12, %196, %199 ; CHECK-LABEL: bpf_prog2: ; CHECK: r0 = *(u16 *)skb[12] # encoding: [0x28,0x00,0x00,0x00,0x0c,0x00,0x00,0x00] ; CHECK: r0 = *(u16 *)skb[16] # encoding: [0x28,0x00,0x00,0x00,0x10,0x00,0x00,0x00] -; CHECK: implicit-def: %R1 +; CHECK: implicit-def: %r1 ; CHECK: r1 = ; CHECK: call 1 # encoding: [0x85,0x00,0x00,0x00,0x01,0x00,0x00,0x00] ; CHECK: call 2 # encoding: [0x85,0x00,0x00,0x00,0x02,0x00,0x00,0x00] diff --git a/test/CodeGen/BPF/undef.ll b/test/CodeGen/BPF/undef.ll index 8d8a5f429514..586a24d1816c 100644 --- a/test/CodeGen/BPF/undef.ll +++ b/test/CodeGen/BPF/undef.ll @@ -1,5 +1,5 @@ -; RUN: not llc < %s -march=bpfel | FileCheck -check-prefixes=CHECK,EL %s -; RUN: not llc < %s -march=bpfeb | FileCheck -check-prefixes=CHECK,EB %s +; RUN: llc < %s -march=bpfel | FileCheck -check-prefixes=CHECK,EL %s +; RUN: llc < %s -march=bpfeb | FileCheck -check-prefixes=CHECK,EB %s %struct.bpf_map_def = type { i32, i32, i32, i32 } %struct.__sk_buff = type opaque @@ -14,34 +14,30 @@ ; Function Attrs: nounwind uwtable define i32 @ebpf_filter(%struct.__sk_buff* nocapture readnone %ebpf_packet) #0 section "socket1" { -; CHECK: r1 = r10 -; CHECK: r1 += -2 -; CHECK: r2 = 0 -; CHECK: *(u16 *)(r1 + 6) = r2 -; CHECK: *(u16 *)(r1 + 4) = r2 -; CHECK: *(u16 *)(r1 + 2) = r2 -; EL: r1 = 134678021 -; EB: r1 = 84281096 -; CHECK: *(u32 *)(r10 - 8) = r1 -; CHECK: r1 = 9 -; CHECK: *(u8 *)(r10 - 4) = r1 -; CHECK: r1 = 10 -; CHECK: *(u8 *)(r10 - 3) = r1 -; CHECK: *(u16 *)(r10 + 24) = r2 -; CHECK: *(u16 *)(r10 + 22) = r2 -; CHECK: *(u16 *)(r10 + 20) = r2 -; CHECK: *(u16 *)(r10 + 18) = r2 -; CHECK: *(u16 *)(r10 + 16) = r2 -; CHECK: *(u16 *)(r10 + 14) = r2 -; CHECK: *(u16 *)(r10 + 12) = r2 -; CHECK: *(u16 *)(r10 + 10) = r2 -; CHECK: *(u16 *)(r10 + 8) = r2 -; CHECK: *(u16 *)(r10 + 6) = r2 -; CHECK: *(u16 *)(r10 - 2) = r2 -; CHECK: *(u16 *)(r10 + 26) = r2 + +; EL: r1 = 11033905661445 ll +; EB: r1 = 361984551142686720 ll +; CHECK: *(u64 *)(r10 - 8) = r1 + +; CHECK: r1 = 0 +; CHECK: *(u16 *)(r10 + 24) = r1 +; CHECK: *(u16 *)(r10 + 22) = r1 +; CHECK: *(u16 *)(r10 + 20) = r1 +; CHECK: *(u16 *)(r10 + 18) = r1 +; CHECK: *(u16 *)(r10 + 16) = r1 +; CHECK: *(u16 *)(r10 + 14) = r1 +; CHECK: *(u16 *)(r10 + 12) = r1 +; CHECK: *(u16 *)(r10 + 10) = r1 +; CHECK: *(u16 *)(r10 + 8) = r1 +; CHECK: *(u16 *)(r10 + 6) = r1 +; CHECK: *(u16 *)(r10 + 4) = r1 +; CHECK: *(u16 *)(r10 + 2) = r1 +; CHECK: *(u16 *)(r10 + 0) = r1 +; CHECK: *(u16 *)(r10 + 26) = r1 + ; CHECK: r2 = r10 ; CHECK: r2 += -8 -; CHECK: r1 = <MCOperand Expr:(routing)>ll +; CHECK: r1 = routing ; CHECK: call bpf_map_lookup_elem ; CHECK: exit %key = alloca %struct.routing_key_2, align 1 diff --git a/test/CodeGen/BPF/warn-call.ll b/test/CodeGen/BPF/warn-call.ll index ae7f78ac1aa8..6dadb359cf60 100644 --- a/test/CodeGen/BPF/warn-call.ll +++ b/test/CodeGen/BPF/warn-call.ll @@ -2,9 +2,6 @@ ; CHECK: error: warn_call.c ; CHECK: built-in function 'memcpy' -; CHECK: error: warn_call.c -; CHECK: global function 'foo' -; CHECK: global function 'bar' define i8* @warn(i8* returned, i8*, i64) local_unnamed_addr #0 !dbg !6 { tail call void @llvm.dbg.value(metadata i8* %0, i64 0, metadata !14, metadata !17), !dbg !18 tail call void @llvm.dbg.value(metadata i8* %1, i64 0, metadata !15, metadata !17), !dbg !19 |
