[llvm] [WebAssembly] Add ref.test_func handling to AsmParser (PR #139642)

Hood Chatham via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 7 10:52:50 PDT 2025


https://github.com/hoodmane updated https://github.com/llvm/llvm-project/pull/139642

>From ba4e21486455fcee36e5521050562cd9be35e9b4 Mon Sep 17 00:00:00 2001
From: Hood Chatham <roberthoodchatham at gmail.com>
Date: Sat, 10 May 2025 22:01:09 -0400
Subject: [PATCH 1/3] [WebAssembly] Add ref.test_func handling to AsmParser

---
 .../AsmParser/WebAssemblyAsmParser.cpp            |  2 ++
 .../lib/Target/WebAssembly/WebAssemblyInstrRef.td |  8 ++++++++
 llvm/test/MC/WebAssembly/reference-types.s        | 15 +++++++++++++++
 3 files changed, 25 insertions(+)

diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
index 7ee6a3d8304be..3fad1710c30c4 100644
--- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
+++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
@@ -668,6 +668,8 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser {
       if (parseFunctionTableOperand(&FunctionTable))
         return true;
       ExpectFuncType = true;
+    } else if (Name == "ref.test_func") {
+      ExpectFuncType = true;
     }
 
     // Returns true if the next tokens are a catch clause
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td
index 2654a09387fd4..8786d78c8e5af 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td
@@ -36,6 +36,14 @@ multiclass REF_I<WebAssemblyRegClass rc, ValueType vt, string ht> {
         Requires<[HasReferenceTypes]>;
 }
 
+defm REF_TEST_FUNCREF :
+  I<(outs I32: $res),
+    (ins TypeIndex:$type, FUNCREF: $ref),
+    (outs),
+    (ins TypeIndex:$type),
+    [],
+    "ref.test_func\t$type, $ref", "ref.test_func $type", 0xfb14>;
+
 defm "" : REF_I<FUNCREF, funcref, "func">;
 defm "" : REF_I<EXTERNREF, externref, "extern">;
 defm "" : REF_I<EXNREF, exnref, "exn">;
diff --git a/llvm/test/MC/WebAssembly/reference-types.s b/llvm/test/MC/WebAssembly/reference-types.s
index cfadede8295ef..8f3bca79bb68f 100644
--- a/llvm/test/MC/WebAssembly/reference-types.s
+++ b/llvm/test/MC/WebAssembly/reference-types.s
@@ -27,6 +27,21 @@ ref_null_test:
   drop
   end_function
 
+# CHECK-LABEL: ref_test_test:
+# CHECK: ref.null_func   # encoding: [0xd0,0x70]
+# CHECK: ref.test () -> () # encoding: [0xfb,0x14,0x80'A',0x80'A',0x80'A',0x80'A',A]
+# CHECK: # fixup A - offset: 2, value: .Ltypeindex0 at TYPEINDEX, kind: fixup_uleb128_i32
+# CHECK: ref.null_func   # encoding: [0xd0,0x70]
+# CHECK: ref.test () -> (i32) # encoding: [0xfb,0x14,0x80'A',0x80'A',0x80'A',0x80'A',A]
+# CHECK: # fixup A - offset: 2, value: .Ltypeindex1 at TYPEINDEX, kind: fixup_uleb128_i32
+ref_test_test:
+  .functype ref_test_test () -> (i32, i32)
+  ref.null_func
+  ref.test_func () -> ()
+  ref.null_func
+  ref.test_func () -> (i32)
+  end_function
+
 # CHECK-LABEL: ref_sig_test_funcref:
 # CHECK-NEXT: .functype ref_sig_test_funcref (funcref) -> (funcref)
 ref_sig_test_funcref:

>From 6a4693a238723f78c9126071b0b0be2ae5481af9 Mon Sep 17 00:00:00 2001
From: Hood Chatham <roberthoodchatham at gmail.com>
Date: Mon, 12 May 2025 20:19:55 -0400
Subject: [PATCH 2/3] Rename to ref.test

---
 .../lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp | 2 +-
 llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td            | 2 +-
 llvm/test/MC/WebAssembly/reference-types.s                    | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
index 3fad1710c30c4..c1b3936c1dcec 100644
--- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
+++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
@@ -668,7 +668,7 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser {
       if (parseFunctionTableOperand(&FunctionTable))
         return true;
       ExpectFuncType = true;
-    } else if (Name == "ref.test_func") {
+    } else if (Name == "ref.test") {
       ExpectFuncType = true;
     }
 
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td
index 8786d78c8e5af..40b87a084c687 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td
@@ -42,7 +42,7 @@ defm REF_TEST_FUNCREF :
     (outs),
     (ins TypeIndex:$type),
     [],
-    "ref.test_func\t$type, $ref", "ref.test_func $type", 0xfb14>;
+    "ref.test\t$type, $ref", "ref.test $type", 0xfb14>;
 
 defm "" : REF_I<FUNCREF, funcref, "func">;
 defm "" : REF_I<EXTERNREF, externref, "extern">;
diff --git a/llvm/test/MC/WebAssembly/reference-types.s b/llvm/test/MC/WebAssembly/reference-types.s
index 8f3bca79bb68f..08aafb23969eb 100644
--- a/llvm/test/MC/WebAssembly/reference-types.s
+++ b/llvm/test/MC/WebAssembly/reference-types.s
@@ -37,9 +37,9 @@ ref_null_test:
 ref_test_test:
   .functype ref_test_test () -> (i32, i32)
   ref.null_func
-  ref.test_func () -> ()
+  ref.test () -> ()
   ref.null_func
-  ref.test_func () -> (i32)
+  ref.test () -> (i32)
   end_function
 
 # CHECK-LABEL: ref_sig_test_funcref:

>From 06f44359b40e5971029e5c8b9321735ad8cbd0ff Mon Sep 17 00:00:00 2001
From: Hood Chatham <roberthoodchatham at gmail.com>
Date: Mon, 7 Jul 2025 19:52:35 +0200
Subject: [PATCH 3/3] Add comment

---
 llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
index c1b3936c1dcec..b1c41bd79fba1 100644
--- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
+++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
@@ -669,6 +669,7 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser {
         return true;
       ExpectFuncType = true;
     } else if (Name == "ref.test") {
+      // When we get support for wasm-gc types, this should become ExpectRefType.
       ExpectFuncType = true;
     }
 



More information about the llvm-commits mailing list