diff options
author | Thomas Lively <tlively@google.com> | 2019-06-26 16:17:15 +0000 |
---|---|---|
committer | Thomas Lively <tlively@google.com> | 2019-06-26 16:17:15 +0000 |
commit | a1d97a960e622ee21550d92809512cb0870be499 (patch) | |
tree | 678b01b3a42a707b3be32cf74c635072c14f74da /llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp | |
parent | c95046501dc2cb535a82c38a5c004a6eddd33e00 (diff) | |
download | llvm-a1d97a960e622ee21550d92809512cb0870be499.zip llvm-a1d97a960e622ee21550d92809512cb0870be499.tar.gz llvm-a1d97a960e622ee21550d92809512cb0870be499.tar.bz2 |
[WebAssembly] Implement tail calls and unify tablegen call classes
Summary:
Implements direct and indirect tail calls enabled by the 'tail-call'
feature in both DAG ISel and FastISel. Updates existing call tests and
adds new tests including a binary encoding test.
Reviewers: aheejin
Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, sunfish, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D62877
llvm-svn: 364445
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp | 88 |
1 files changed, 48 insertions, 40 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp index 002246a..cca27d9 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp @@ -107,14 +107,14 @@ bool WebAssembly::isCallDirect(const MachineInstr &MI) { switch (MI.getOpcode()) { case WebAssembly::CALL_VOID: case WebAssembly::CALL_VOID_S: - case WebAssembly::CALL_I32: - case WebAssembly::CALL_I32_S: - case WebAssembly::CALL_I64: - case WebAssembly::CALL_I64_S: - case WebAssembly::CALL_F32: - case WebAssembly::CALL_F32_S: - case WebAssembly::CALL_F64: - case WebAssembly::CALL_F64_S: + case WebAssembly::CALL_i32: + case WebAssembly::CALL_i32_S: + case WebAssembly::CALL_i64: + case WebAssembly::CALL_i64_S: + case WebAssembly::CALL_f32: + case WebAssembly::CALL_f32_S: + case WebAssembly::CALL_f64: + case WebAssembly::CALL_f64_S: case WebAssembly::CALL_v16i8: case WebAssembly::CALL_v16i8_S: case WebAssembly::CALL_v8i16: @@ -127,8 +127,10 @@ bool WebAssembly::isCallDirect(const MachineInstr &MI) { case WebAssembly::CALL_v4f32_S: case WebAssembly::CALL_v2f64: case WebAssembly::CALL_v2f64_S: - case WebAssembly::CALL_EXCEPT_REF: - case WebAssembly::CALL_EXCEPT_REF_S: + case WebAssembly::CALL_ExceptRef: + case WebAssembly::CALL_ExceptRef_S: + case WebAssembly::RET_CALL: + case WebAssembly::RET_CALL_S: return true; default: return false; @@ -139,14 +141,14 @@ bool WebAssembly::isCallIndirect(const MachineInstr &MI) { switch (MI.getOpcode()) { case WebAssembly::CALL_INDIRECT_VOID: case WebAssembly::CALL_INDIRECT_VOID_S: - case WebAssembly::CALL_INDIRECT_I32: - case WebAssembly::CALL_INDIRECT_I32_S: - case WebAssembly::CALL_INDIRECT_I64: - case WebAssembly::CALL_INDIRECT_I64_S: - case WebAssembly::CALL_INDIRECT_F32: - case WebAssembly::CALL_INDIRECT_F32_S: - case WebAssembly::CALL_INDIRECT_F64: - case WebAssembly::CALL_INDIRECT_F64_S: + case WebAssembly::CALL_INDIRECT_i32: + case WebAssembly::CALL_INDIRECT_i32_S: + case WebAssembly::CALL_INDIRECT_i64: + case WebAssembly::CALL_INDIRECT_i64_S: + case WebAssembly::CALL_INDIRECT_f32: + case WebAssembly::CALL_INDIRECT_f32_S: + case WebAssembly::CALL_INDIRECT_f64: + case WebAssembly::CALL_INDIRECT_f64_S: case WebAssembly::CALL_INDIRECT_v16i8: case WebAssembly::CALL_INDIRECT_v16i8_S: case WebAssembly::CALL_INDIRECT_v8i16: @@ -159,8 +161,10 @@ bool WebAssembly::isCallIndirect(const MachineInstr &MI) { case WebAssembly::CALL_INDIRECT_v4f32_S: case WebAssembly::CALL_INDIRECT_v2f64: case WebAssembly::CALL_INDIRECT_v2f64_S: - case WebAssembly::CALL_INDIRECT_EXCEPT_REF: - case WebAssembly::CALL_INDIRECT_EXCEPT_REF_S: + case WebAssembly::CALL_INDIRECT_ExceptRef: + case WebAssembly::CALL_INDIRECT_ExceptRef_S: + case WebAssembly::RET_CALL_INDIRECT: + case WebAssembly::RET_CALL_INDIRECT_S: return true; default: return false; @@ -173,15 +177,19 @@ unsigned WebAssembly::getCalleeOpNo(const MachineInstr &MI) { case WebAssembly::CALL_VOID_S: case WebAssembly::CALL_INDIRECT_VOID: case WebAssembly::CALL_INDIRECT_VOID_S: + case WebAssembly::RET_CALL: + case WebAssembly::RET_CALL_S: + case WebAssembly::RET_CALL_INDIRECT: + case WebAssembly::RET_CALL_INDIRECT_S: return 0; - case WebAssembly::CALL_I32: - case WebAssembly::CALL_I32_S: - case WebAssembly::CALL_I64: - case WebAssembly::CALL_I64_S: - case WebAssembly::CALL_F32: - case WebAssembly::CALL_F32_S: - case WebAssembly::CALL_F64: - case WebAssembly::CALL_F64_S: + case WebAssembly::CALL_i32: + case WebAssembly::CALL_i32_S: + case WebAssembly::CALL_i64: + case WebAssembly::CALL_i64_S: + case WebAssembly::CALL_f32: + case WebAssembly::CALL_f32_S: + case WebAssembly::CALL_f64: + case WebAssembly::CALL_f64_S: case WebAssembly::CALL_v16i8: case WebAssembly::CALL_v16i8_S: case WebAssembly::CALL_v8i16: @@ -194,16 +202,16 @@ unsigned WebAssembly::getCalleeOpNo(const MachineInstr &MI) { case WebAssembly::CALL_v4f32_S: case WebAssembly::CALL_v2f64: case WebAssembly::CALL_v2f64_S: - case WebAssembly::CALL_EXCEPT_REF: - case WebAssembly::CALL_EXCEPT_REF_S: - case WebAssembly::CALL_INDIRECT_I32: - case WebAssembly::CALL_INDIRECT_I32_S: - case WebAssembly::CALL_INDIRECT_I64: - case WebAssembly::CALL_INDIRECT_I64_S: - case WebAssembly::CALL_INDIRECT_F32: - case WebAssembly::CALL_INDIRECT_F32_S: - case WebAssembly::CALL_INDIRECT_F64: - case WebAssembly::CALL_INDIRECT_F64_S: + case WebAssembly::CALL_ExceptRef: + case WebAssembly::CALL_ExceptRef_S: + case WebAssembly::CALL_INDIRECT_i32: + case WebAssembly::CALL_INDIRECT_i32_S: + case WebAssembly::CALL_INDIRECT_i64: + case WebAssembly::CALL_INDIRECT_i64_S: + case WebAssembly::CALL_INDIRECT_f32: + case WebAssembly::CALL_INDIRECT_f32_S: + case WebAssembly::CALL_INDIRECT_f64: + case WebAssembly::CALL_INDIRECT_f64_S: case WebAssembly::CALL_INDIRECT_v16i8: case WebAssembly::CALL_INDIRECT_v16i8_S: case WebAssembly::CALL_INDIRECT_v8i16: @@ -216,8 +224,8 @@ unsigned WebAssembly::getCalleeOpNo(const MachineInstr &MI) { case WebAssembly::CALL_INDIRECT_v4f32_S: case WebAssembly::CALL_INDIRECT_v2f64: case WebAssembly::CALL_INDIRECT_v2f64_S: - case WebAssembly::CALL_INDIRECT_EXCEPT_REF: - case WebAssembly::CALL_INDIRECT_EXCEPT_REF_S: + case WebAssembly::CALL_INDIRECT_ExceptRef: + case WebAssembly::CALL_INDIRECT_ExceptRef_S: return 1; default: llvm_unreachable("Not a call instruction"); |