Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / WebAssembly / switch-in-loop.ll
blob08e6820c49d4200d03a1eac7d0fed0c76915e8d9
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(ptr)
10 declare void @b(ptr)
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(ptr %ops, i32 %len) {
40 entry:
41   %res = alloca i32
42   store i32 0, ptr %res
43   %cmp6 = icmp sgt i32 %len, 0
44   br i1 %cmp6, label %for.body, label %for.cond.cleanup
46 for.cond.cleanup.loopexit:                        ; preds = %sw.epilog
47   %.pre = load i32, ptr %res
48   br label %for.cond.cleanup
50 for.cond.cleanup:                                 ; preds = %for.cond.cleanup.loopexit, %entry
51   %0 = phi i32 [ %.pre, %for.cond.cleanup.loopexit ], [ 0, %entry ]
52   ret i32 %0
54 for.body:                                         ; preds = %entry, %sw.epilog
55   %i.07 = phi i32 [ %inc, %sw.epilog ], [ 0, %entry ]
56   %arrayidx = getelementptr inbounds i32, ptr %ops, i32 %i.07
57   %1 = load i32, ptr %arrayidx
58   switch i32 %1, label %sw.epilog [
59     i32 0, label %sw.bb
60     i32 1, label %sw.bb1
61   ]
63 sw.bb:                                            ; preds = %for.body
64   call void @a(ptr nonnull %res)
65   br label %sw.epilog
67 sw.bb1:                                           ; preds = %for.body
68   call void @b(ptr nonnull %res)
69   br label %sw.epilog
71 sw.epilog:                                        ; preds = %for.body, %sw.bb1, %sw.bb
72   %inc = add nuw nsw i32 %i.07, 1
73   %exitcond = icmp eq i32 %inc, %len
74   br i1 %exitcond, label %for.cond.cleanup.loopexit, label %for.body