aboutsummaryrefslogtreecommitdiff
path: root/test/CodeGen/BPF
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-12-18 20:10:56 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-12-18 20:10:56 +0000
commit044eb2f6afba375a914ac9d8024f8f5142bb912e (patch)
tree1475247dc9f9fe5be155ebd4c9069c75aadf8c20 /test/CodeGen/BPF
parenteb70dddbd77e120e5d490bd8fbe7ff3f8fa81c6b (diff)
Notes
Diffstat (limited to 'test/CodeGen/BPF')
-rw-r--r--test/CodeGen/BPF/cc_args.ll6
-rw-r--r--test/CodeGen/BPF/cc_args_be.ll6
-rw-r--r--test/CodeGen/BPF/cc_ret.ll4
-rw-r--r--test/CodeGen/BPF/dwarfdump.ll6
-rw-r--r--test/CodeGen/BPF/ex1.ll2
-rw-r--r--test/CodeGen/BPF/fi_ri.ll2
-rw-r--r--test/CodeGen/BPF/inline_asm.ll54
-rw-r--r--test/CodeGen/BPF/intrinsics.ll39
-rw-r--r--test/CodeGen/BPF/mem_offset_be.ll2
-rw-r--r--test/CodeGen/BPF/objdump_cond_op.ll69
-rw-r--r--test/CodeGen/BPF/objdump_cond_op_2.ll39
-rw-r--r--test/CodeGen/BPF/objdump_intrinsics.ll39
-rw-r--r--test/CodeGen/BPF/remove_truncate_3.ll106
-rw-r--r--test/CodeGen/BPF/rodata_1.ll4
-rw-r--r--test/CodeGen/BPF/rodata_2.ll2
-rw-r--r--test/CodeGen/BPF/sanity.ll4
-rw-r--r--test/CodeGen/BPF/select_ri.ll4
-rw-r--r--test/CodeGen/BPF/setcc.ll39
-rw-r--r--test/CodeGen/BPF/sockex2.ll2
-rw-r--r--test/CodeGen/BPF/undef.ll52
-rw-r--r--test/CodeGen/BPF/warn-call.ll3
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