| ; 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 datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" |
| 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 |
| } |