blob: bbca46850843b5355b7ce8d735519973cb3d6ab5 [file] [log] [blame]
; Checks generated using command:
; llvm/utils/update_test_body.py llvm/test/CodeGen/BPF/jump_table_global_var.ll
; RUN: rm -rf %t && split-file %s %t && cd %t
; RUN: llc -march=bpf -mcpu=v4 < test.ll | FileCheck %s
;
; Source code:
; int foo(unsigned a) {
; __label__ l1, l2;
; void *jt1[] = {[0]=&&l1, [1]=&&l2};
; int ret = 0;
;
; goto *jt1[a % 2];
; l1: ret += 1;
; l2: ret += 3;
; return ret;
; }
;
; Compilation Flags:
; clang --target=bpf -mcpu=v4 -O2 -emit-llvm -S test.c
.ifdef GEN
;--- test.ll
@__const.foo.jt1 = private unnamed_addr constant [2 x ptr] [ptr blockaddress(@foo, %l1), ptr blockaddress(@foo, %l2)], align 8
define dso_local range(i32 3, 5) i32 @foo(i32 noundef %a) local_unnamed_addr {
entry:
%rem = and i32 %a, 1
%idxprom = zext nneg i32 %rem to i64
%arrayidx = getelementptr inbounds nuw [2 x ptr], ptr @__const.foo.jt1, i64 0, i64 %idxprom
%0 = load ptr, ptr %arrayidx, align 8
indirectbr ptr %0, [label %l1, label %l2]
l1: ; preds = %entry
br label %l2
l2: ; preds = %l1, %entry
%ret.0 = phi i32 [ 4, %l1 ], [ 3, %entry ]
ret i32 %ret.0
}
;--- gen
echo ""
echo "; Generated checks follow"
echo ";"
llc -march=bpf -mcpu=v4 < test.ll \
| awk '/# -- End function/ {p=0} /@function/ {p=1} p {print "; CHECK" ": " $0}'
.endif
; Generated checks follow
;
; CHECK: .type foo,@function
; CHECK: foo: # @foo
; CHECK: .Lfoo$local:
; CHECK: .type .Lfoo$local,@function
; CHECK: .cfi_startproc
; CHECK: # %bb.0: # %entry
; CHECK: # kill: def $w1 killed $w1 def $r1
; CHECK: w1 &= 1
; CHECK: r1 <<= 3
; CHECK: r2 = BPF.JT.0.0 ll
; CHECK: r2 += r1
; CHECK: r1 = *(u64 *)(r2 + 0)
; CHECK: gotox r1
; CHECK: .Ltmp0: # Block address taken
; CHECK: LBB0_1: # %l1
; CHECK: w0 = 4
; CHECK: goto LBB0_3
; CHECK: .Ltmp1: # Block address taken
; CHECK: LBB0_2: # %l2
; CHECK: w0 = 3
; CHECK: LBB0_3: # %.split
; CHECK: exit
; CHECK: .Lfunc_end0:
; CHECK: .size foo, .Lfunc_end0-foo
; CHECK: .size .Lfoo$local, .Lfunc_end0-foo
; CHECK: .cfi_endproc
; CHECK: .section .jumptables,"",@progbits
; CHECK: BPF.JT.0.0:
; CHECK: .quad LBB0_1
; CHECK: .quad LBB0_2
; CHECK: .size BPF.JT.0.0, 16