diff options
Diffstat (limited to 'llvm/test/CodeGen/WebAssembly/switch.ll')
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/switch.ll | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/WebAssembly/switch.ll b/llvm/test/CodeGen/WebAssembly/switch.ll new file mode 100644 index 00000000000..8aaa391cb52 --- /dev/null +++ b/llvm/test/CodeGen/WebAssembly/switch.ll @@ -0,0 +1,173 @@ +; RUN: llc < %s -asm-verbose=false | FileCheck %s + +; Test switch instructions. + +target datalayout = "e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +declare void @foo0() +declare void @foo1() +declare void @foo2() +declare void @foo3() +declare void @foo4() +declare void @foo5() + +; CHECK-LABEL: bar32 +; CHECK: (block $BB0_8) +; CHECK: (block $BB0_7) +; CHECK: (block $BB0_6) +; CHECK: (block $BB0_5) +; CHECK: (block $BB0_4) +; CHECK: (block $BB0_3) +; CHECK: (block $BB0_2) +; CHECK: (switch {{.*}} $BB0_2 $BB0_2 $BB0_2 $BB0_2 $BB0_2 $BB0_2 $BB0_2 $BB0_2 $BB0_3 $BB0_3 $BB0_3 $BB0_3 $BB0_3 $BB0_3 $BB0_3 $BB0_3 $BB0_4 $BB0_4 $BB0_4 $BB0_4 $BB0_4 $BB0_4 $BB0_5 $BB0_6 $BB0_7) +; CHECk: BB0_2: +; CHECK: (setlocal {{.*}} (global $foo0)) +; CHECK: BB0_3: +; CHECK: (setlocal {{.*}} (global $foo1)) +; CHECK: BB0_4: +; CHECK: (setlocal {{.*}} (global $foo2)) +; CHECK: BB0_5: +; CHECK: (setlocal {{.*}} (global $foo3)) +; CHECK: BB0_6: +; CHECK: (setlocal {{.*}} (global $foo4)) +; CHECK: BB0_7: +; CHECK: (setlocal {{.*}} (global $foo5)) +; CHECK: BB0_8: +; CHECK: (return) +define void @bar32(i32 %n) { +entry: + switch i32 %n, label %sw.epilog [ + i32 0, label %sw.bb + i32 1, label %sw.bb + i32 2, label %sw.bb + i32 3, label %sw.bb + i32 4, label %sw.bb + i32 5, label %sw.bb + i32 6, label %sw.bb + i32 7, label %sw.bb.1 + i32 8, label %sw.bb.1 + i32 9, label %sw.bb.1 + i32 10, label %sw.bb.1 + i32 11, label %sw.bb.1 + i32 12, label %sw.bb.1 + i32 13, label %sw.bb.1 + i32 14, label %sw.bb.1 + i32 15, label %sw.bb.2 + i32 16, label %sw.bb.2 + i32 17, label %sw.bb.2 + i32 18, label %sw.bb.2 + i32 19, label %sw.bb.2 + i32 20, label %sw.bb.2 + i32 21, label %sw.bb.3 + i32 22, label %sw.bb.4 + i32 23, label %sw.bb.5 + ] + +sw.bb: ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry + tail call void @foo0() + br label %sw.epilog + +sw.bb.1: ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry + tail call void @foo1() + br label %sw.epilog + +sw.bb.2: ; preds = %entry, %entry, %entry, %entry, %entry, %entry + tail call void @foo2() + br label %sw.epilog + +sw.bb.3: ; preds = %entry + tail call void @foo3() + br label %sw.epilog + +sw.bb.4: ; preds = %entry + tail call void @foo4() + br label %sw.epilog + +sw.bb.5: ; preds = %entry + tail call void @foo5() + br label %sw.epilog + +sw.epilog: ; preds = %entry, %sw.bb.5, %sw.bb.4, %sw.bb.3, %sw.bb.2, %sw.bb.1, %sw.bb + ret void +} + +; CHECK-LABEL: bar64 +; CHECK: (block $BB1_8) +; CHECK: (block $BB1_7) +; CHECK: (block $BB1_6) +; CHECK: (block $BB1_5) +; CHECK: (block $BB1_4) +; CHECK: (block $BB1_3) +; CHECK: (block $BB1_2) +; CHECK: (switch {{.*}} $BB1_2 $BB1_2 $BB1_2 $BB1_2 $BB1_2 $BB1_2 $BB1_2 $BB1_2 $BB1_3 $BB1_3 $BB1_3 $BB1_3 $BB1_3 $BB1_3 $BB1_3 $BB1_3 $BB1_4 $BB1_4 $BB1_4 $BB1_4 $BB1_4 $BB1_4 $BB1_5 $BB1_6 $BB1_7) +; CHECk: BB1_2: +; CHECK: (setlocal {{.*}} (global $foo0)) +; CHECK: BB1_3: +; CHECK: (setlocal {{.*}} (global $foo1)) +; CHECK: BB1_4: +; CHECK: (setlocal {{.*}} (global $foo2)) +; CHECK: BB1_5: +; CHECK: (setlocal {{.*}} (global $foo3)) +; CHECK: BB1_6: +; CHECK: (setlocal {{.*}} (global $foo4)) +; CHECK: BB1_7: +; CHECK: (setlocal {{.*}} (global $foo5)) +; CHECK: BB1_8: +; CHECK: (return) +define void @bar64(i64 %n) { +entry: + switch i64 %n, label %sw.epilog [ + i64 0, label %sw.bb + i64 1, label %sw.bb + i64 2, label %sw.bb + i64 3, label %sw.bb + i64 4, label %sw.bb + i64 5, label %sw.bb + i64 6, label %sw.bb + i64 7, label %sw.bb.1 + i64 8, label %sw.bb.1 + i64 9, label %sw.bb.1 + i64 10, label %sw.bb.1 + i64 11, label %sw.bb.1 + i64 12, label %sw.bb.1 + i64 13, label %sw.bb.1 + i64 14, label %sw.bb.1 + i64 15, label %sw.bb.2 + i64 16, label %sw.bb.2 + i64 17, label %sw.bb.2 + i64 18, label %sw.bb.2 + i64 19, label %sw.bb.2 + i64 20, label %sw.bb.2 + i64 21, label %sw.bb.3 + i64 22, label %sw.bb.4 + i64 23, label %sw.bb.5 + ] + +sw.bb: ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry + tail call void @foo0() + br label %sw.epilog + +sw.bb.1: ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry + tail call void @foo1() + br label %sw.epilog + +sw.bb.2: ; preds = %entry, %entry, %entry, %entry, %entry, %entry + tail call void @foo2() + br label %sw.epilog + +sw.bb.3: ; preds = %entry + tail call void @foo3() + br label %sw.epilog + +sw.bb.4: ; preds = %entry + tail call void @foo4() + br label %sw.epilog + +sw.bb.5: ; preds = %entry + tail call void @foo5() + br label %sw.epilog + +sw.epilog: ; preds = %entry, %sw.bb.5, %sw.bb.4, %sw.bb.3, %sw.bb.2, %sw.bb.1, %sw.bb + ret void +} |