summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/WebAssembly
diff options
context:
space:
mode:
authorDerek Schuff <dschuff@google.com>2015-11-10 00:30:57 +0000
committerDerek Schuff <dschuff@google.com>2015-11-10 00:30:57 +0000
commitffa143ce814101fb1277ba65b20bdf86775d0b32 (patch)
tree99d79c8b7ff474be111642d8722dd9217089ea17 /llvm/test/CodeGen/WebAssembly
parent6d87f28afd467df3370d43af37760ce9b3d1a179 (diff)
downloadbcm5719-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.ll34
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
+}
OpenPOWER on IntegriCloud