[llvm] [BPF] Support Jump Table (PR #149715)

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 20 10:10:48 PDT 2025


================
@@ -0,0 +1,56 @@
+; RUN: llc -march=bpf -mcpu=v4 < %s | 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
+
+ at __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
+}
+
+; CHECK:         w1 &= 1
----------------
MaskRay wrote:

Also consider https://llvm.org/docs/TestingGuide.html#extra-files

https://github.com/llvm/llvm-project/pull/149715


More information about the llvm-commits mailing list