spirv reader: add some dynamic index tests

Change-Id: I87fe03f3950e02778828225fc47f6349bcfaaae6
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/210654
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/tint/lang/spirv/reader/lower/vector_element_pointer_test.cc b/src/tint/lang/spirv/reader/lower/vector_element_pointer_test.cc
index bd30d05..640563f 100644
--- a/src/tint/lang/spirv/reader/lower/vector_element_pointer_test.cc
+++ b/src/tint/lang/spirv/reader/lower/vector_element_pointer_test.cc
@@ -228,6 +228,56 @@
     EXPECT_EQ(expect, str());
 }
 
+TEST_F(SpirvReader_VectorElementPointerTest, Store_DynamicIndex) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* foo = b.Function("foo", ty.void_());
+    b.Append(foo->Block(), [&] {
+        auto* vec = b.Var<function, vec4<u32>>("vec");
+        auto* access = b.Access<ptr<function, u32>>(vec, b.Load(dyn_index));
+        b.Store(access, 42_u);
+        b.Return(foo);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%foo = func():void {
+  $B2: {
+    %vec:ptr<function, vec4<u32>, read_write> = var
+    %4:u32 = load %dyn_index
+    %5:ptr<function, u32, read_write> = access %vec, %4
+    store %5, 42u
+    ret
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%foo = func():void {
+  $B2: {
+    %vec:ptr<function, vec4<u32>, read_write> = var
+    %4:u32 = load %dyn_index
+    store_vector_element %vec, %4, 42u
+    ret
+  }
+}
+)";
+
+    Run(VectorElementPointer);
+
+    EXPECT_EQ(expect, str());
+}
+
 TEST_F(SpirvReader_VectorElementPointerTest, AccessBeforeUse) {
     auto* foo = b.Function("foo", ty.void_());
     b.Append(foo->Block(), [&] {
@@ -382,6 +432,57 @@
     EXPECT_EQ(expect, str());
 }
 
+TEST_F(SpirvReader_VectorElementPointerTest, ViaArray_DynamicIndex) {
+    auto* dyn_index = b.Var("dyn_index", ty.ptr<uniform, u32>());
+    dyn_index->SetBindingPoint(0, 0);
+    mod.root_block->Append(dyn_index);
+
+    auto* foo = b.Function("foo", ty.void_());
+    b.Append(foo->Block(), [&] {
+        auto* arr = b.Var<function, array<vec4<f32>, 4>>("arr");
+        auto* access = b.Access<ptr<function, f32>>(arr, b.Load(dyn_index), 2_u);
+        b.Store(access, 42_f);
+        b.Return(foo);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%foo = func():void {
+  $B2: {
+    %arr:ptr<function, array<vec4<f32>, 4>, read_write> = var
+    %4:u32 = load %dyn_index
+    %5:ptr<function, f32, read_write> = access %arr, %4, 2u
+    store %5, 42.0f
+    ret
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %dyn_index:ptr<uniform, u32, read> = var @binding_point(0, 0)
+}
+
+%foo = func():void {
+  $B2: {
+    %arr:ptr<function, array<vec4<f32>, 4>, read_write> = var
+    %4:u32 = load %dyn_index
+    %5:ptr<function, vec4<f32>, read_write> = access %arr, %4
+    store_vector_element %5, 2u, 42.0f
+    ret
+  }
+}
+)";
+
+    Run(VectorElementPointer);
+
+    EXPECT_EQ(expect, str());
+}
+
 TEST_F(SpirvReader_VectorElementPointerTest, ViaStruct) {
     auto* str_ty = ty.Struct(mod.symbols.New("str"), {{
                                                          mod.symbols.New("vec"),