https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/147409
Backport a8a9a7f Requested by: @sunfishcode >From 9fd5816e48736cc51a118311e805d3e1f3758092 Mon Sep 17 00:00:00 2001 From: Alex Crichton <a...@alexcrichton.com> Date: Wed, 2 Jul 2025 05:26:30 +0200 Subject: [PATCH] [WebAssembly] Fix inline assembly with vector types (#146574) This commit fixes using inline assembly with v128 results. Previously this failed with an internal assertion about a failure to legalize a `CopyFromReg` where the source register was typed `v8f16`. It looks like the type used for the destination register was whatever was listed first in the `def V128 : WebAssemblyRegClass` listing, so the types were shuffled around to have a default-supported type. A small test was added as well which failed to generate previously and should now pass in generation. This test passed on LLVM 18 additionally and regressed by accident in #93228 which was first included in LLVM 19. (cherry picked from commit a8a9a7f95a695c02bdf3d5821d1c62cc8e08c2ff) --- .../lib/Target/WebAssembly/WebAssemblyRegisterInfo.td | 4 ++-- llvm/test/CodeGen/WebAssembly/inline-asm.ll | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.td b/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.td index 17889dacc868c..31a33c1e7365b 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.td @@ -64,8 +64,8 @@ def I32 : WebAssemblyRegClass<[i32], 32, (add FP32, SP32, I32_0)>; def I64 : WebAssemblyRegClass<[i64], 64, (add FP64, SP64, I64_0)>; def F32 : WebAssemblyRegClass<[f32], 32, (add F32_0)>; def F64 : WebAssemblyRegClass<[f64], 64, (add F64_0)>; -def V128 : WebAssemblyRegClass<[v8f16, v4f32, v2f64, v2i64, v4i32, v16i8, - v8i16], +def V128 : WebAssemblyRegClass<[v2i64, v4i32, v16i8, v8i16, + v8f16, v4f32, v2f64], 128, (add V128_0)>; def FUNCREF : WebAssemblyRegClass<[funcref], 0, (add FUNCREF_0)>; def EXTERNREF : WebAssemblyRegClass<[externref], 0, (add EXTERNREF_0)>; diff --git a/llvm/test/CodeGen/WebAssembly/inline-asm.ll b/llvm/test/CodeGen/WebAssembly/inline-asm.ll index 4462cfb7aa0c4..c378fd953a555 100644 --- a/llvm/test/CodeGen/WebAssembly/inline-asm.ll +++ b/llvm/test/CodeGen/WebAssembly/inline-asm.ll @@ -129,7 +129,18 @@ entry: ret i32 %ret } +; CHECK-LABEL: v128_load +; CHECK: local.get 0 +; CHECK-NEXT: v128.load 0 +; CHECK-NEXT: local.set 1 +define <4 x i32> @v128_load(ptr %v) #1 { +entry: + %0 = tail call <4 x i32> asm "local.get $1\0Av128.load 0\0Alocal.set $0", "=r,r"(ptr %v) + ret <4 x i32> %0 +} + attributes #0 = { nounwind } +attributes #1 = { "target-features"="+simd128" } !0 = !{i32 47} !1 = !{i32 145} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits