diff options
| author | Derek Schuff <dschuff@google.com> | 2015-11-10 00:30:57 +0000 |
|---|---|---|
| committer | Derek Schuff <dschuff@google.com> | 2015-11-10 00:30:57 +0000 |
| commit | ffa143ce814101fb1277ba65b20bdf86775d0b32 (patch) | |
| tree | 99d79c8b7ff474be111642d8722dd9217089ea17 /llvm/test/CodeGen/WebAssembly | |
| parent | 6d87f28afd467df3370d43af37760ce9b3d1a179 (diff) | |
| download | bcm5719-llvm-ffa143ce814101fb1277ba65b20bdf86775d0b32.tar.gz bcm5719-llvm-ffa143ce814101fb1277ba65b20bdf86775d0b32.zip | |
[WebAssembly] Support 'unreachable' expression
Lower LLVM's 'unreachable' terminator to ISD::TRAP, and lower ISD::TRAP to
wasm's 'unreachable' expression.
WebAssembly type-checks expressions, but a noreturn function with a
return type that doesn't match the context will cause a check
failure. So we lower LLVM 'unreachable' to ISD::TRAP and then lower that
to WebAssembly's 'unreachable' expression, which typechecks in any
context and causes a trap if executed.
Differential Revision: http://reviews.llvm.org/D14515
llvm-svn: 252566
Diffstat (limited to 'llvm/test/CodeGen/WebAssembly')
| -rw-r--r-- | llvm/test/CodeGen/WebAssembly/unreachable.ll | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/WebAssembly/unreachable.ll b/llvm/test/CodeGen/WebAssembly/unreachable.ll new file mode 100644 index 00000000000..a16e4529033 --- /dev/null +++ b/llvm/test/CodeGen/WebAssembly/unreachable.ll @@ -0,0 +1,34 @@ +; RUN: llc < %s -asm-verbose=false | FileCheck %s +; RUN: llc < %s -asm-verbose=false -fast-isel | FileCheck %s + +; Test that LLVM unreachable instruction and trap intrinsic are lowered to +; wasm unreachable + +target datalayout = "e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +declare void @llvm.trap() +declare void @llvm.debugtrap() +declare void @abort() + +; CHECK-LABEL: f1: +; CHECK: call $abort +; CHECK: unreachable +define i32 @f1() { + call void @abort() + unreachable +} + +; CHECK-LABEL: f2: +; CHECK: unreachable +define void @f2() { + call void @llvm.trap() + ret void +} + +; CHECK-LABEL: f3: +; CHECK: unreachable +define void @f3() { + call void @llvm.debugtrap() + ret void +} |

