[llvm] f56b592 - [MC][WebAssembly] Fix type checking for bulk memory instructions

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 4 14:10:31 PDT 2023


Author: Sam Clegg
Date: 2023-04-04T14:10:10-07:00
New Revision: f56b5921d3954cbd99175d0df44030e7782bc456

URL: https://github.com/llvm/llvm-project/commit/f56b5921d3954cbd99175d0df44030e7782bc456
DIFF: https://github.com/llvm/llvm-project/commit/f56b5921d3954cbd99175d0df44030e7782bc456.diff

LOG: [MC][WebAssembly] Fix type checking for bulk memory instructions

This code currently assumes that all bulk memory operations occur on
memory 0 which who's type is determined by the wasm32 vs wasm64 target
triple.  Further improvements would be need to support multi-memory.

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

Added: 
    

Modified: 
    llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp
    llvm/test/MC/WebAssembly/bulk-memory-encodings.s

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp
index 5303f446fbdb8..c32eca081b804 100644
--- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp
+++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp
@@ -125,15 +125,15 @@ bool WebAssemblyAsmTypeCheck::getLocal(SMLoc ErrorLoc, const MCInst &Inst,
 bool WebAssemblyAsmTypeCheck::checkEnd(SMLoc ErrorLoc, bool PopVals) {
   if (LastSig.Returns.size() > Stack.size())
     return typeError(ErrorLoc, "end: insufficient values on the type stack");
-  
+
   if (PopVals) {
     for (auto VT : llvm::reverse(LastSig.Returns)) {
-      if (popType(ErrorLoc, VT)) 
+      if (popType(ErrorLoc, VT))
         return true;
     }
     return false;
   }
-  
+
   for (size_t i = 0; i < LastSig.Returns.size(); i++) {
     auto EVT = LastSig.Returns[i];
     auto PVT = Stack[Stack.size() - LastSig.Returns.size() + i];
@@ -272,6 +272,30 @@ bool WebAssemblyAsmTypeCheck::typeCheck(SMLoc ErrorLoc, const MCInst &Inst,
       return true;
     if (popType(ErrorLoc, wasm::ValType::I32))
       return true;
+  } else if (Name == "memory.fill") {
+    Type = is64 ? wasm::ValType::I64 : wasm::ValType::I32;
+    if (popType(ErrorLoc, Type))
+      return true;
+    if (popType(ErrorLoc, wasm::ValType::I32))
+      return true;
+    if (popType(ErrorLoc, Type))
+      return true;
+  } else if (Name == "memory.copy") {
+    Type = is64 ? wasm::ValType::I64 : wasm::ValType::I32;
+    if (popType(ErrorLoc, Type))
+      return true;
+    if (popType(ErrorLoc, Type))
+      return true;
+    if (popType(ErrorLoc, Type))
+      return true;
+  } else if (Name == "memory.init") {
+    Type = is64 ? wasm::ValType::I64 : wasm::ValType::I32;
+    if (popType(ErrorLoc, wasm::ValType::I32))
+      return true;
+    if (popType(ErrorLoc, wasm::ValType::I32))
+      return true;
+    if (popType(ErrorLoc, Type))
+      return true;
   } else if (Name == "drop") {
     if (popType(ErrorLoc, {}))
       return true;

diff  --git a/llvm/test/MC/WebAssembly/bulk-memory-encodings.s b/llvm/test/MC/WebAssembly/bulk-memory-encodings.s
index 0f3a4a9f053c6..c9af1af24a356 100644
--- a/llvm/test/MC/WebAssembly/bulk-memory-encodings.s
+++ b/llvm/test/MC/WebAssembly/bulk-memory-encodings.s
@@ -1,19 +1,53 @@
-# RUN: llvm-mc -show-encoding -no-type-check -triple=wasm32-unknown-unknown -mattr=+bulk-memory < %s | FileCheck %s
-# RUN: llvm-mc -show-encoding -no-type-check -triple=wasm64-unknown-unknown -mattr=+bulk-memory < %s | FileCheck %s
+# RUN: split-file %s %t
+# RUN: llvm-mc -show-encoding -triple=wasm32-unknown-unknown -mattr=+bulk-memory < %t/wasm32.s | FileCheck %s
+# RUN: llvm-mc -show-encoding -triple=wasm64-unknown-unknown -mattr=+bulk-memory < %t/wasm64.s | FileCheck %s
 
+#--- wasm32.s
 main:
     .functype main () -> ()
 
+    i32.const 2 # dest address
+    i32.const 3 # src offset
+    i32.const 4 # count
     # CHECK: memory.init 3, 0 # encoding: [0xfc,0x08,0x03,0x00]
     memory.init 3, 0
 
     # CHECK: data.drop 3 # encoding: [0xfc,0x09,0x03]
     data.drop 3
 
+    i32.const 2 # dst
+    i32.const 3 # src
+    i32.const 4 # count
     # CHECK: memory.copy 0, 0 # encoding: [0xfc,0x0a,0x00,0x00]
     memory.copy 0, 0
 
+    i32.const 2 # addr
+    i32.const 3 # val
+    i32.const 4 # count
     # CHECK: memory.fill 0 # encoding: [0xfc,0x0b,0x00]
     memory.fill 0
 
     end_function
+
+#--- wasm64.s
+main:
+    .functype main () -> ()
+
+    i64.const 2 # dest address
+    i32.const 3 # src offset
+    i32.const 4 # count
+    memory.init 3, 0
+
+    data.drop 3
+
+    i64.const 2 # dst
+    i64.const 3 # src
+    i64.const 4 # count
+    memory.copy 0, 0
+
+    i64.const 2 # addr
+    i32.const 3 # val
+    i64.const 4 # count
+    memory.fill 0
+
+    end_function


        


More information about the llvm-commits mailing list