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