[hlsl] Fix f16 vector element stores in storage

When the source pointer for an f16 store_vector_element instruction
did not come from a `access` instruction, we were creating an invalid
bitcast from f16 to u32.

Use the `Store()` method on this codepath instead, which takes care of
the special-casing needed for the f16 case.

Bug: 42251045
Change-Id: I3be490f0709000f1acfd3cea844ea3549f7ab6f4
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/211095
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/tint/lang/hlsl/writer/raise/decompose_storage_access.cc b/src/tint/lang/hlsl/writer/raise/decompose_storage_access.cc
index 5366784..33d9d73 100644
--- a/src/tint/lang/hlsl/writer/raise/decompose_storage_access.cc
+++ b/src/tint/lang/hlsl/writer/raise/decompose_storage_access.cc
@@ -890,12 +890,8 @@
         b.InsertBefore(sve, [&] {
             OffsetData offset{};
             UpdateOffsetData(sve->Index(), var_ty->StoreType()->DeepestElement()->Size(), &offset);
-
-            auto* cast = b.Bitcast(ty.u32(), sve->Value());
-            b.MemberCall<hlsl::ir::MemberBuiltinCall>(ty.void_(), BuiltinFn::kStore, var,
-                                                      OffsetToValue(offset), cast);
+            Store(sve, var, sve->Value(), offset);
         });
-        sve->Destroy();
     }
 };
 
diff --git a/src/tint/lang/hlsl/writer/raise/decompose_storage_access_test.cc b/src/tint/lang/hlsl/writer/raise/decompose_storage_access_test.cc
index 6002ce0..c7c90eb 100644
--- a/src/tint/lang/hlsl/writer/raise/decompose_storage_access_test.cc
+++ b/src/tint/lang/hlsl/writer/raise/decompose_storage_access_test.cc
@@ -2079,8 +2079,7 @@
     b.ir.root_block->Append(var);
     auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kFragment);
     b.Append(func->Block(), [&] {
-        b.StoreVectorElement(b.Access(ty.ptr<storage, vec3<f32>, core::Access::kReadWrite>(), var),
-                             1_u, 2_f);
+        b.StoreVectorElement(var, 1_u, 2_f);
         b.Return(func);
     });
 
@@ -2091,8 +2090,7 @@
 
 %foo = @fragment func():void {
   $B2: {
-    %3:ptr<storage, vec3<f32>, read_write> = access %v
-    store_vector_element %3, 1u, 2.0f
+    store_vector_element %v, 1u, 2.0f
     ret
   }
 }
@@ -2123,8 +2121,7 @@
     b.ir.root_block->Append(var);
     auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kFragment);
     b.Append(func->Block(), [&] {
-        b.StoreVectorElement(b.Access(ty.ptr<storage, vec3<f16>, core::Access::kReadWrite>(), var),
-                             1_u, 2_h);
+        b.StoreVectorElement(var, 1_u, 2_h);
         b.Return(func);
     });
 
@@ -2135,8 +2132,7 @@
 
 %foo = @fragment func():void {
   $B2: {
-    %3:ptr<storage, vec3<f16>, read_write> = access %v
-    store_vector_element %3, 1u, 2.0h
+    store_vector_element %v, 1u, 2.0h
     ret
   }
 }
diff --git a/test/tint/bug/fxc/vector_assignment_dynamic_index/storage_var.wgsl.expected.ir.dxc.hlsl b/test/tint/bug/fxc/vector_assignment_dynamic_index/storage_var.wgsl.expected.ir.dxc.hlsl
index e75cb75..345e683 100644
--- a/test/tint/bug/fxc/vector_assignment_dynamic_index/storage_var.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/bug/fxc/vector_assignment_dynamic_index/storage_var.wgsl.expected.ir.dxc.hlsl
@@ -5,7 +5,7 @@
 RWByteAddressBuffer v1 : register(u1);
 [numthreads(1, 1, 1)]
 void main() {
-  uint v = (uint(i[0u].x) * 4u);
-  v1.Store((0u + v), asuint(1.0f));
+  uint v = (0u + (uint(i[0u].x) * 4u));
+  v1.Store(v, asuint(1.0f));
 }
 
diff --git a/test/tint/bug/fxc/vector_assignment_dynamic_index/storage_var.wgsl.expected.ir.fxc.hlsl b/test/tint/bug/fxc/vector_assignment_dynamic_index/storage_var.wgsl.expected.ir.fxc.hlsl
index e75cb75..345e683 100644
--- a/test/tint/bug/fxc/vector_assignment_dynamic_index/storage_var.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/bug/fxc/vector_assignment_dynamic_index/storage_var.wgsl.expected.ir.fxc.hlsl
@@ -5,7 +5,7 @@
 RWByteAddressBuffer v1 : register(u1);
 [numthreads(1, 1, 1)]
 void main() {
-  uint v = (uint(i[0u].x) * 4u);
-  v1.Store((0u + v), asuint(1.0f));
+  uint v = (0u + (uint(i[0u].x) * 4u));
+  v1.Store(v, asuint(1.0f));
 }