[llvm] [WebAssembly] [Draft] Legalize i128 to v2i64 (PR #149461)

Jasmine Tang via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 17 23:18:38 PDT 2025


https://github.com/badumbatish created https://github.com/llvm/llvm-project/pull/149461

Fixes https://github.com/llvm/llvm-project/issues/149230



>From bd5eb786d08b12e1c00b6a5402f46dd460d9bb43 Mon Sep 17 00:00:00 2001
From: Jasmine Tang <jjasmine at igalia.com>
Date: Thu, 17 Jul 2025 22:28:02 -0700
Subject: [PATCH 1/2] Pre commit test to transform i128 to v2i64

---
 .../CodeGen/WebAssembly/simd-load-custom-128.ll | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 llvm/test/CodeGen/WebAssembly/simd-load-custom-128.ll

diff --git a/llvm/test/CodeGen/WebAssembly/simd-load-custom-128.ll b/llvm/test/CodeGen/WebAssembly/simd-load-custom-128.ll
new file mode 100644
index 0000000000000..3a7789c437090
--- /dev/null
+++ b/llvm/test/CodeGen/WebAssembly/simd-load-custom-128.ll
@@ -0,0 +1,17 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -mattr=+simd128 | FileCheck %s
+target triple = "wasm32-unknown-unknown"
+
+define void @i128_to_v128(ptr %ptr) {
+; CHECK-LABEL: i128_to_v128:
+; CHECK:         .functype i128_to_v128 (i32) -> ()
+; CHECK-NEXT:  # %bb.0:
+; CHECK-NEXT:    i64.load $push0=, 0($0)
+; CHECK-NEXT:    i64.store 0($0), $pop0
+; CHECK-NEXT:    i64.load $push1=, 8($0)
+; CHECK-NEXT:    i64.store 8($0), $pop1
+; CHECK-NEXT:    return
+    %2 = load i128, ptr %ptr
+    store volatile i128 %2, ptr %ptr
+    ret void
+}

>From 8432eeac1cef6054db58d5b13d4c211653805a19 Mon Sep 17 00:00:00 2001
From: Jasmine Tang <jjasmine at igalia.com>
Date: Thu, 17 Jul 2025 22:28:19 -0700
Subject: [PATCH 2/2] Draft commit for reviews and questions

---
 .../WebAssembly/WebAssemblyISelLowering.cpp       | 15 +++++++++++++++
 .../CodeGen/WebAssembly/simd-load-custom-128.ll   |  6 ++----
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
index bf2e04caa0a61..3edaa5cd0b091 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
@@ -93,6 +93,8 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
       setOperationAction(ISD::LOAD, T, Custom);
       setOperationAction(ISD::STORE, T, Custom);
     }
+
+    setOperationAction(ISD::LOAD, MVT::i128, Custom);
   }
   if (Subtarget->hasFP16()) {
     setOperationAction(ISD::LOAD, MVT::v8f16, Custom);
@@ -1609,6 +1611,19 @@ void WebAssemblyTargetLowering::ReplaceNodeResults(
   case ISD::SUB:
     Results.push_back(Replace128Op(N, DAG));
     break;
+  case ISD::STORE:
+    // TODO: I think i can get away with just LOAD for now
+    break;
+  case ISD::LOAD: {
+    LoadSDNode *LD = cast<LoadSDNode>(N);
+    EVT VT = LD->getValueType(0);
+    assert(VT == MVT::i128);
+    SDValue Pair = DAG.getLoad(MVT::v2i64, SDLoc(LD), LD->getChain(),
+                               LD->getBasePtr(), LD->getMemOperand());
+    Results.push_back(Pair.getValue(0));
+    Results.push_back(Pair.getValue(1));
+    break;
+  }
   default:
     llvm_unreachable(
         "ReplaceNodeResults not implemented for this op for WebAssembly!");
diff --git a/llvm/test/CodeGen/WebAssembly/simd-load-custom-128.ll b/llvm/test/CodeGen/WebAssembly/simd-load-custom-128.ll
index 3a7789c437090..f56b94f140a3a 100644
--- a/llvm/test/CodeGen/WebAssembly/simd-load-custom-128.ll
+++ b/llvm/test/CodeGen/WebAssembly/simd-load-custom-128.ll
@@ -6,10 +6,8 @@ define void @i128_to_v128(ptr %ptr) {
 ; CHECK-LABEL: i128_to_v128:
 ; CHECK:         .functype i128_to_v128 (i32) -> ()
 ; CHECK-NEXT:  # %bb.0:
-; CHECK-NEXT:    i64.load $push0=, 0($0)
-; CHECK-NEXT:    i64.store 0($0), $pop0
-; CHECK-NEXT:    i64.load $push1=, 8($0)
-; CHECK-NEXT:    i64.store 8($0), $pop1
+; CHECK-NEXT:    v128.load $push0=, 0($0)
+; CHECK-NEXT:    v128.store 0($0), $pop0
 ; CHECK-NEXT:    return
     %2 = load i128, ptr %ptr
     store volatile i128 %2, ptr %ptr



More information about the llvm-commits mailing list