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