[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