[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / WebAssembly / switch-in-loop.ll
blobe3bb0e0b97f3a32b0c983e8c9b1c67bcb0ba50ae
1 ; RUN: llc < %s -asm-verbose=false -verify-machineinstrs | FileCheck %s
3 ;; Test that a small but nontrivial switch in a loop (like in a
4 ;; bytecode interpreter) lowers reasonably without any irreducible
5 ;; control flow being introduced.
7 target triple = "wasm32"
9 declare void @a(i32*)
10 declare void @b(i32*)
12 ; CHECK-LABEL: switch_in_loop:
13 ; CHECK-NEXT: .functype switch_in_loop (i32, i32) -> (i32)
14 ; CHECK:    global.get __stack_pointer
15 ; CHECK:    global.set __stack_pointer
16 ; CHECK:    block
17 ; CHECK:    br_if 0
18 ; CHECK: .LBB0_2:
19 ; CHECK:    loop
20 ; CHECK:    block
21 ; CHECK:    block
22 ; CHECK:    block
23 ; CHECK:    br_table {0, 1, 2}
24 ; CHECK: .LBB0_3:
25 ; CHECK:    end_block
26 ; CHECK:    call a
27 ; CHECK:    br 1
28 ; CHECK: .LBB0_4:
29 ; CHECK:    end_block
30 ; CHECK:    call b
31 ; CHECK: .LBB0_5:
32 ; CHECK:    end_block
33 ; CHECK:    br_if 0
34 ; CHECK:    end_loop
35 ; CHECK: .LBB0_7:
36 ; CHECK:    end_block
37 ; CHECK:    global.set __stack_pointer
38 ; CHECK:    end_function
39 define i32 @switch_in_loop(i32* %ops, i32 %len) {
40 entry:
41   %res = alloca i32
42   %0 = bitcast i32* %res to i8*
43   store i32 0, i32* %res
44   %cmp6 = icmp sgt i32 %len, 0
45   br i1 %cmp6, label %for.body, label %for.cond.cleanup
47 for.cond.cleanup.loopexit:                        ; preds = %sw.epilog
48   %.pre = load i32, i32* %res
49   br label %for.cond.cleanup
51 for.cond.cleanup:                                 ; preds = %for.cond.cleanup.loopexit, %entry
52   %1 = phi i32 [ %.pre, %for.cond.cleanup.loopexit ], [ 0, %entry ]
53   ret i32 %1
55 for.body:                                         ; preds = %entry, %sw.epilog
56   %i.07 = phi i32 [ %inc, %sw.epilog ], [ 0, %entry ]
57   %arrayidx = getelementptr inbounds i32, i32* %ops, i32 %i.07
58   %2 = load i32, i32* %arrayidx
59   switch i32 %2, label %sw.epilog [
60     i32 0, label %sw.bb
61     i32 1, label %sw.bb1
62   ]
64 sw.bb:                                            ; preds = %for.body
65   call void @a(i32* nonnull %res)
66   br label %sw.epilog
68 sw.bb1:                                           ; preds = %for.body
69   call void @b(i32* nonnull %res)
70   br label %sw.epilog
72 sw.epilog:                                        ; preds = %for.body, %sw.bb1, %sw.bb
73   %inc = add nuw nsw i32 %i.07, 1
74   %exitcond = icmp eq i32 %inc, %len
75   br i1 %exitcond, label %for.cond.cleanup.loopexit, label %for.body