60 lines · plain
1; RUN: llc < %s -asm-verbose=false -verify-machineinstrs | FileCheck %s2 3; Test lowering of __builtin_debugtrap in cases where lowering it via4; the normal UNREACHABLE instruction would yield invalid5; 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: loop15; CHECK-NEXT: unreachable16; CHECK-NEXT: i32.const 017; CHECK-NEXT: br_if 018; CHECK-NEXT: end_loop19; CHECK-NEXT: end_function20define void @foo(i32 %g) {21entry:22 br label %for.body23 24for.body:25 call void @llvm.debugtrap()26 %exitcond = icmp eq i32 undef, %g27 br i1 %exitcond, label %for.cond.cleanup, label %for.body28 29for.cond.cleanup:30 ret void31}32 33; CHECK-LABEL: middle_of_block:34; CHECK-NEXT: .functype middle_of_block (i32, i32) -> (i32)35; CHECK-NEXT: unreachable36; CHECK-NEXT: local.get 037; CHECK-NEXT: local.get 138; CHECK-NEXT: i32.add39; CHECK-NEXT: end_function40define i32 @middle_of_block(i32 %x, i32 %y) {41 %r = add i32 %x, %y42 call void @llvm.debugtrap()43 ret i32 %r44}45 46; CHECK-LABEL: really_middle_of_block:47; CHECK-NEXT: .functype really_middle_of_block () -> (i32)48; CHECK-NEXT: call bar49; CHECK-NEXT: drop50; CHECK-NEXT: unreachable51; CHECK-NEXT: call bar52; CHECK-NEXT: end_function53declare 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 %r59}60