xref: /llvm-project/llvm/test/CodeGen/WebAssembly/debugtrap.ll (revision 122b0220fd45ee71acda912b0b712bb8edb6ba46)
1; RUN: llc < %s -asm-verbose=false -verify-machineinstrs | FileCheck %s
2
3; Test lowering of __builtin_debugtrap in cases where lowering it via
4; the normal UNREACHABLE instruction would yield invalid
5; MachineFunctions.
6
7target triple = "wasm32"
8
9declare void @llvm.debugtrap()
10
11; CHECK-LABEL: foo:
12; CHECK-NEXT: .functype       foo (i32) -> ()
13; CHECK-NEXT: .LBB0_1:
14; CHECK-NEXT: loop
15; CHECK-NEXT: unreachable
16; CHECK-NEXT: i32.const       0
17; CHECK-NEXT: br_if           0
18; CHECK-NEXT: end_loop
19; CHECK-NEXT: end_function
20define void @foo(i32 %g) {
21entry:
22  br label %for.body
23
24for.body:
25  call void @llvm.debugtrap()
26  %exitcond = icmp eq i32 undef, %g
27  br i1 %exitcond, label %for.cond.cleanup, label %for.body
28
29for.cond.cleanup:
30  ret void
31}
32
33; CHECK-LABEL: middle_of_block:
34; CHECK-NEXT: .functype       middle_of_block (i32, i32) -> (i32)
35; CHECK-NEXT: unreachable
36; CHECK-NEXT: local.get       0
37; CHECK-NEXT: local.get       1
38; CHECK-NEXT: i32.add
39; CHECK-NEXT: end_function
40define i32 @middle_of_block(i32 %x, i32 %y) {
41  %r = add i32 %x, %y
42  call void @llvm.debugtrap()
43  ret i32 %r
44}
45
46; CHECK-LABEL: really_middle_of_block:
47; CHECK-NEXT: .functype       really_middle_of_block () -> (i32)
48; CHECK-NEXT: call    bar
49; CHECK-NEXT: drop
50; CHECK-NEXT: unreachable
51; CHECK-NEXT: call    bar
52; CHECK-NEXT: end_function
53declare i32 @bar()
54define i32 @really_middle_of_block() {
55  %x = call i32 @bar()
56  call void @llvm.debugtrap()
57  %r = call i32 @bar()
58  ret i32 %r
59}
60