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

via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 3 11:02:21 PDT 2025


================
@@ -0,0 +1,98 @@
+; RUN: llc -march=bpf -mcpu=v4 -bpf-min-jump-table-entries=3 < %s | FileCheck %s
+;
+; Source code:
+;   int ret_user;
+;   int foo(int a)
+;   {
+;      switch (a) {
+;      case 1: ret_user = 18; break;
+;      case 20: ret_user = 6; break;
+;      case 30: ret_user = 2; break;
+;      default: break;
+;      }
+;      return 0;
+;   }
+;
+; Compilation Flags:
+;   clang --target=bpf -mcpu=v4 -O2 -emit-llvm -S test.c
+
+ at ret_user = dso_local local_unnamed_addr global i32 0, align 4
+
+define dso_local noundef i32 @foo(i32 noundef %a) local_unnamed_addr {
+entry:
+  switch i32 %a, label %sw.epilog [
+    i32 1, label %sw.epilog.sink.split
+    i32 20, label %sw.bb1
+    i32 30, label %sw.bb2
+  ]
+
+sw.bb1:                                           ; preds = %entry
+  br label %sw.epilog.sink.split
+
+sw.bb2:                                           ; preds = %entry
+  br label %sw.epilog.sink.split
+
+sw.epilog.sink.split:                             ; preds = %entry, %sw.bb1, %sw.bb2
+  %.sink = phi i32 [ 2, %sw.bb2 ], [ 6, %sw.bb1 ], [ 18, %entry ]
+  store i32 %.sink, ptr @ret_user, align 4
+  br label %sw.epilog
+
+sw.epilog:                                        ; preds = %sw.epilog.sink.split, %entry
+  ret i32 0
+}
+
+; CHECK:            w1 += -1
+; CHECK-NEXT:       if w1 > 29 goto LBB0_5
+; CHECK:            w2 = 18
+; CHECK-NEXT:       r1 <<= 3
+; CHECK-NEXT:       r3 = BPF.JT.0.0 ll
+; CHECK-NEXT:       r4 = BPF.JT.0.0 ll
+; CHECK-NEXT:       r4 += r1
+; CHECK-NEXT:       r1 = *(u64 *)(r4 + 0)
+; CHECK-NEXT:       r3 += r1
+; CHECK-NEXT:       gotox r3
+; CHECK-NEXT:  LBB0_2:                                 # %sw.bb1
+; CHECK-NEXT:       w2 = 6
+; CHECK-NEXT:       goto LBB0_4
+; CHECK-NEXT:  LBB0_3:                                 # %sw.bb2
+; CHECK-NEXT:       w2 = 2
+; CHECK-NEXT:  LBB0_4:                                 # %sw.epilog.sink.split
+; CHECK-NEXT:       r1 = ret_user ll
+; CHECK-NEXT:       *(u32 *)(r1 + 0) = w2
+; CHECK-NEXT:  LBB0_5:                                 # %sw.epilog
+; CHECK-NEXT:       w0 = 0
+; CHECK-NEXT:       exit
+
----------------
yonghong-song wrote:

Sounds good. Will do.

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


More information about the llvm-commits mailing list