diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h @@ -385,6 +385,8 @@ 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 @@ 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; diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp @@ -75,6 +75,8 @@ 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/llvm/test/CodeGen/WebAssembly/reg-argument.mir b/llvm/test/CodeGen/WebAssembly/reg-argument.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/WebAssembly/reg-argument.mir @@ -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 +... diff --git a/llvm/test/CodeGen/WebAssembly/reg-copy.mir b/llvm/test/CodeGen/WebAssembly/reg-copy.mir --- a/llvm/test/CodeGen/WebAssembly/reg-copy.mir +++ b/llvm/test/CodeGen/WebAssembly/reg-copy.mir @@ -55,3 +55,14 @@ %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 +...