| ; RUN: llc < %s -asm-verbose=false -verify-machineinstrs | FileCheck %s | |
| ; Test lowering of __builtin_debugtrap in cases where lowering it via | |
| ; the normal UNREACHABLE instruction would yield invalid | |
| ; MachineFunctions. | |
| target triple = "wasm32" | |
| declare void @llvm.debugtrap() | |
| ; CHECK-LABEL: foo: | |
| ; CHECK-NEXT: .functype foo (i32) -> () | |
| ; CHECK-NEXT: .LBB0_1: | |
| ; CHECK-NEXT: loop | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK-NEXT: i32.const 0 | |
| ; CHECK-NEXT: br_if 0 | |
| ; CHECK-NEXT: end_loop | |
| ; CHECK-NEXT: end_function | |
| define void @foo(i32 %g) { | |
| entry: | |
| br label %for.body | |
| for.body: | |
| call void @llvm.debugtrap() | |
| %exitcond = icmp eq i32 undef, %g | |
| br i1 %exitcond, label %for.cond.cleanup, label %for.body | |
| for.cond.cleanup: | |
| ret void | |
| } | |
| ; CHECK-LABEL: middle_of_block: | |
| ; CHECK-NEXT: .functype middle_of_block (i32, i32) -> (i32) | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK-NEXT: local.get 0 | |
| ; CHECK-NEXT: local.get 1 | |
| ; CHECK-NEXT: i32.add | |
| ; CHECK-NEXT: end_function | |
| define i32 @middle_of_block(i32 %x, i32 %y) { | |
| %r = add i32 %x, %y | |
| call void @llvm.debugtrap() | |
| ret i32 %r | |
| } | |
| ; CHECK-LABEL: really_middle_of_block: | |
| ; CHECK-NEXT: .functype really_middle_of_block () -> (i32) | |
| ; CHECK-NEXT: call bar | |
| ; CHECK-NEXT: drop | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK-NEXT: call bar | |
| ; CHECK-NEXT: end_function | |
| declare i32 @bar() | |
| define i32 @really_middle_of_block() { | |
| %x = call i32 @bar() | |
| call void @llvm.debugtrap() | |
| %r = call i32 @bar() | |
| ret i32 %r | |
| } |