OSDN Git Service

[WebAssembly] Add missing utility methods for exnref type
authorHeejin Ahn <aheejin@gmail.com>
Mon, 15 Jul 2019 23:04:00 +0000 (23:04 +0000)
committerHeejin Ahn <aheejin@gmail.com>
Mon, 15 Jul 2019 23:04:00 +0000 (23:04 +0000)
Summary:
This adds missing utility methods and copy instruction handling for
`exnref` type and also adds tests.

`tee` instruction tests are missing because `isTee` is currently only
used in ExplicitLocals pass and testing that pass in mir requires
serialization of stackified registers in mir files, which is a bit
nontrivial because `MachineFunctionInfo` only has info of vreg numbers
(which are large integers) but not the mir's register numbers. But this
change is quite trivial anyway.

Reviewers: tlively

Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D64705

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@366149 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h
lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp
test/CodeGen/WebAssembly/reg-argument.mir [new file with mode: 0644]
test/CodeGen/WebAssembly/reg-copy.mir

index 31ad88b..7a9f59b 100644 (file)
@@ -385,6 +385,8 @@ inline bool isArgument(unsigned Opc) {
   case WebAssembly::ARGUMENT_v4f32_S:
   case WebAssembly::ARGUMENT_v2f64:
   case WebAssembly::ARGUMENT_v2f64_S:
+  case WebAssembly::ARGUMENT_exnref:
+  case WebAssembly::ARGUMENT_exnref_S:
     return true;
   default:
     return false;
@@ -423,6 +425,8 @@ inline bool isTee(unsigned Opc) {
   case WebAssembly::TEE_F64_S:
   case WebAssembly::TEE_V128:
   case WebAssembly::TEE_V128_S:
+  case WebAssembly::TEE_EXNREF:
+  case WebAssembly::TEE_EXNREF_S:
     return true;
   default:
     return false;
index d7022ce..a86c9af 100644 (file)
@@ -75,6 +75,8 @@ void WebAssemblyInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
     CopyOpcode = WebAssembly::COPY_F64;
   else if (RC == &WebAssembly::V128RegClass)
     CopyOpcode = WebAssembly::COPY_V128;
+  else if (RC == &WebAssembly::EXNREFRegClass)
+    CopyOpcode = WebAssembly::COPY_EXNREF;
   else
     llvm_unreachable("Unexpected register class");
 
diff --git a/test/CodeGen/WebAssembly/reg-argument.mir b/test/CodeGen/WebAssembly/reg-argument.mir
new file mode 100644 (file)
index 0000000..70c033f
--- /dev/null
@@ -0,0 +1,59 @@
+# RUN: llc -mtriple=wasm32-unknown-unknown %s -o - -run-pass wasm-argument-move  | FileCheck %s
+
+# wasm-argument-move pass moves all ARGUMENT instructions to the top of the
+# entry BB.
+---
+name: argument_i32
+# CHECK-LABEL: argument_i32
+body: |
+  ; CHECK-LABEL: bb.0:
+  ; CHECK-NEXT: %1:i32 = ARGUMENT_i32 0
+  bb.0:
+    %0:i32 = CONST_I32 0, implicit-def $arguments
+    %1:i32 = ARGUMENT_i32 0, implicit $arguments
+    RETURN_VOID implicit-def $arguments
+...
+---
+name: argument_i64
+# CHECK-LABEL: argument_i64
+body: |
+  ; CHECK-LABEL: bb.0:
+  ; CHECK-NEXT: %1:i64 = ARGUMENT_i64 0
+  bb.0:
+    %0:i32 = CONST_I32 0, implicit-def $arguments
+    %1:i64 = ARGUMENT_i64 0, implicit $arguments
+    RETURN_VOID implicit-def $arguments
+...
+---
+name: argument_f32
+# CHECK-LABEL: argument_f32
+body: |
+  ; CHECK-LABEL: bb.0:
+  ; CHECK-NEXT: %1:f32 = ARGUMENT_f32 0
+  bb.0:
+    %0:i32 = CONST_I32 0, implicit-def $arguments
+    %1:f32 = ARGUMENT_f32 0, implicit $arguments
+    RETURN_VOID implicit-def $arguments
+...
+---
+name: argument_f64
+# CHECK-LABEL: argument_f64
+body: |
+  ; CHECK-LABEL: bb.0:
+  ; CHECK-NEXT: %1:f64 = ARGUMENT_f64 0
+  bb.0:
+    %0:i32 = CONST_I32 0, implicit-def $arguments
+    %1:f64 = ARGUMENT_f64 0, implicit $arguments
+    RETURN_VOID implicit-def $arguments
+...
+---
+name: argument_exnref
+# CHECK-LABEL: argument_exnref
+body: |
+  ; CHECK-LABEL: bb.0:
+  ; CHECK-NEXT: %1:exnref = ARGUMENT_exnref 0
+  bb.0:
+    %0:i32 = CONST_I32 0, implicit-def $arguments
+    %1:exnref = ARGUMENT_exnref 0, implicit $arguments
+    RETURN_VOID implicit-def $arguments
+...
index 0a36269..a077c34 100644 (file)
@@ -55,3 +55,14 @@ body: |
     %0:v128 = COPY %1:v128
     RETURN_VOID implicit-def $arguments
 ...
+---
+name: copy_exnref
+# CHECK-LABEL: copy_exnref
+body: |
+  ; CHECK-LABEL: bb.0:
+  ; CHECK-NEXT: %0:exnref = COPY_EXNREF %1:exnref
+  ; CHECK-NEXT: RETURN_VOID
+  bb.0:
+    %0:exnref = COPY %1:exnref
+    RETURN_VOID implicit-def $arguments
+...