tint: Add test cases for tint:1666
This change does not attempt to fix this issue.
Bug: tint:1665
Bug: tint:1666
Change-Id: I9b40a25279b939977c826f38592518b6b086c06b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/101161
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
diff --git a/test/tint/bug/tint/1666.wgsl b/test/tint/bug/tint/1666.wgsl
new file mode 100644
index 0000000..ad56594
--- /dev/null
+++ b/test/tint/bug/tint/1666.wgsl
@@ -0,0 +1,29 @@
+fn vector() {
+ let idx = 3;
+ let x = vec2(1,2)[idx];
+}
+
+fn matrix() {
+ let idx = 4;
+ let x = mat2x2(1,2,3,4)[idx];
+}
+
+fn fixed_size_array() {
+ let arr = array(1,2);
+ let idx = 3;
+ let x = arr[idx];
+}
+
+@group(0) @binding(0) var<storage> rarr : array<f32>;
+fn runtime_size_array() {
+ let idx = -1;
+ let x = rarr[idx];
+}
+
+@compute @workgroup_size(1)
+fn f() {
+ vector();
+ matrix();
+ fixed_size_array();
+ runtime_size_array();
+}
diff --git a/test/tint/bug/tint/1666.wgsl.expected.dxc.hlsl b/test/tint/bug/tint/1666.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3f8125c
--- /dev/null
+++ b/test/tint/bug/tint/1666.wgsl.expected.dxc.hlsl
@@ -0,0 +1,48 @@
+SKIP: FAILED
+
+void tint_symbol() {
+ const int idx = 3;
+ const int x = int2(1, 2)[idx];
+}
+
+void tint_symbol_1() {
+ const int idx = 4;
+ const float2 x = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f))[idx];
+}
+
+void fixed_size_array() {
+ const int arr[2] = {1, 2};
+ const int idx = 3;
+ const int x = arr[idx];
+}
+
+ByteAddressBuffer rarr : register(t0, space0);
+
+void runtime_size_array() {
+ const int idx = -1;
+ const float x = asfloat(rarr.Load((4u * uint(idx))));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+ tint_symbol();
+ tint_symbol_1();
+ fixed_size_array();
+ runtime_size_array();
+ return;
+}
+DXC validation failure:
+shader.hlsl:3:28: error: vector element index '3' is out of bounds
+ const int x = int2(1, 2)[idx];
+ ^
+shader.hlsl:8:69: error: matrix row index '4' is out of bounds
+ const float2 x = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f))[idx];
+ ^
+shader.hlsl:14:17: error: array index 3 is out of bounds
+ const int x = arr[idx];
+ ^
+shader.hlsl:12:3: note: array 'arr' declared here
+ const int arr[2] = {1, 2};
+ ^
+
+
diff --git a/test/tint/bug/tint/1666.wgsl.expected.fxc.hlsl b/test/tint/bug/tint/1666.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2a69fe5
--- /dev/null
+++ b/test/tint/bug/tint/1666.wgsl.expected.fxc.hlsl
@@ -0,0 +1,35 @@
+SKIP: FAILED
+
+void tint_symbol() {
+ const int idx = 3;
+ const int x = int2(1, 2)[idx];
+}
+
+void tint_symbol_1() {
+ const int idx = 4;
+ const float2 x = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f))[idx];
+}
+
+void fixed_size_array() {
+ const int arr[2] = {1, 2};
+ const int idx = 3;
+ const int x = arr[idx];
+}
+
+ByteAddressBuffer rarr : register(t0, space0);
+
+void runtime_size_array() {
+ const int idx = -1;
+ const float x = asfloat(rarr.Load((4u * uint(idx))));
+}
+
+[numthreads(1, 1, 1)]
+void f() {
+ tint_symbol();
+ tint_symbol_1();
+ fixed_size_array();
+ runtime_size_array();
+ return;
+}
+FXC validation failure:
+T:\tmp\dawn-temp\dawn-src\test\tint\Shader@0x0000019913EB4550(3,17-31): error X3030: array index out of bounds
diff --git a/test/tint/bug/tint/1666.wgsl.expected.glsl b/test/tint/bug/tint/1666.wgsl.expected.glsl
new file mode 100644
index 0000000..2c6fa18
--- /dev/null
+++ b/test/tint/bug/tint/1666.wgsl.expected.glsl
@@ -0,0 +1,39 @@
+#version 310 es
+
+void vector() {
+ int idx = 3;
+ int x = ivec2(1, 2)[idx];
+}
+
+void matrix() {
+ int idx = 4;
+ vec2 x = mat2(vec2(1.0f, 2.0f), vec2(3.0f, 4.0f))[idx];
+}
+
+void fixed_size_array() {
+ int arr[2] = int[2](1, 2);
+ int idx = 3;
+ int x = arr[idx];
+}
+
+layout(binding = 0, std430) buffer rarr_block_ssbo {
+ float inner[];
+} rarr;
+
+void runtime_size_array() {
+ int idx = -1;
+ float x = rarr.inner[idx];
+}
+
+void f() {
+ vector();
+ matrix();
+ fixed_size_array();
+ runtime_size_array();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+ f();
+ return;
+}
diff --git a/test/tint/bug/tint/1666.wgsl.expected.msl b/test/tint/bug/tint/1666.wgsl.expected.msl
new file mode 100644
index 0000000..9327f8a
--- /dev/null
+++ b/test/tint/bug/tint/1666.wgsl.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+template<typename T, size_t N>
+struct tint_array {
+ const constant T& operator[](size_t i) const constant { return elements[i]; }
+ device T& operator[](size_t i) device { return elements[i]; }
+ const device T& operator[](size_t i) const device { return elements[i]; }
+ thread T& operator[](size_t i) thread { return elements[i]; }
+ const thread T& operator[](size_t i) const thread { return elements[i]; }
+ threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+ const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+ T elements[N];
+};
+
+struct tint_symbol_3 {
+ /* 0x0000 */ tint_array<float, 1> arr;
+};
+
+void vector() {
+ int const idx = 3;
+ int const x = int2(1, 2)[idx];
+}
+
+void tint_symbol() {
+ int const idx = 4;
+ float2 const x = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f))[idx];
+}
+
+void fixed_size_array() {
+ tint_array<int, 2> const arr = tint_array<int, 2>{1, 2};
+ int const idx = 3;
+ int const x = arr[idx];
+}
+
+void runtime_size_array(const device tint_array<float, 1>* const tint_symbol_1) {
+ int const idx = -1;
+ float const x = (*(tint_symbol_1))[idx];
+}
+
+kernel void f(const device tint_symbol_3* tint_symbol_2 [[buffer(0)]]) {
+ vector();
+ tint_symbol();
+ fixed_size_array();
+ runtime_size_array(&((*(tint_symbol_2)).arr));
+ return;
+}
+
diff --git a/test/tint/bug/tint/1666.wgsl.expected.spvasm b/test/tint/bug/tint/1666.wgsl.expected.spvasm
new file mode 100644
index 0000000..ac0c05f
--- /dev/null
+++ b/test/tint/bug/tint/1666.wgsl.expected.spvasm
@@ -0,0 +1,97 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 60
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %f "f"
+ OpExecutionMode %f LocalSize 1 1 1
+ OpName %rarr_block "rarr_block"
+ OpMemberName %rarr_block 0 "inner"
+ OpName %rarr "rarr"
+ OpName %vector "vector"
+ OpName %matrix "matrix"
+ OpName %var_for_index "var_for_index"
+ OpName %fixed_size_array "fixed_size_array"
+ OpName %var_for_index_1 "var_for_index_1"
+ OpName %runtime_size_array "runtime_size_array"
+ OpName %f "f"
+ OpDecorate %rarr_block Block
+ OpMemberDecorate %rarr_block 0 Offset 0
+ OpDecorate %_runtimearr_float ArrayStride 4
+ OpDecorate %rarr NonWritable
+ OpDecorate %rarr DescriptorSet 0
+ OpDecorate %rarr Binding 0
+ OpDecorate %_arr_int_uint_2 ArrayStride 4
+ %float = OpTypeFloat 32
+%_runtimearr_float = OpTypeRuntimeArray %float
+ %rarr_block = OpTypeStruct %_runtimearr_float
+%_ptr_StorageBuffer_rarr_block = OpTypePointer StorageBuffer %rarr_block
+ %rarr = OpVariable %_ptr_StorageBuffer_rarr_block StorageBuffer
+ %void = OpTypeVoid
+ %6 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %int_3 = OpConstant %int 3
+ %v2int = OpTypeVector %int 2
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %15 = OpConstantComposite %v2int %int_1 %int_2
+ %int_4 = OpConstant %int 4
+ %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %24 = OpConstantComposite %v2float %float_1 %float_2
+ %float_3 = OpConstant %float 3
+ %float_4 = OpConstant %float 4
+ %27 = OpConstantComposite %v2float %float_3 %float_4
+ %28 = OpConstantComposite %mat2v2float %24 %27
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+ %31 = OpConstantNull %mat2v2float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+ %uint = OpTypeInt 32 0
+ %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+ %40 = OpConstantComposite %_arr_int_uint_2 %int_1 %int_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+ %43 = OpConstantNull %_arr_int_uint_2
+%_ptr_Function_int = OpTypePointer Function %int
+ %int_n1 = OpConstant %int -1
+ %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+ %vector = OpFunction %void None %6
+ %9 = OpLabel
+ %16 = OpVectorExtractDynamic %int %15 %int_3
+ OpReturn
+ OpFunctionEnd
+ %matrix = OpFunction %void None %6
+ %18 = OpLabel
+%var_for_index = OpVariable %_ptr_Function_mat2v2float Function %31
+ OpStore %var_for_index %28
+ %33 = OpAccessChain %_ptr_Function_v2float %var_for_index %int_4
+ %34 = OpLoad %v2float %33
+ OpReturn
+ OpFunctionEnd
+%fixed_size_array = OpFunction %void None %6
+ %36 = OpLabel
+%var_for_index_1 = OpVariable %_ptr_Function__arr_int_uint_2 Function %43
+ OpStore %var_for_index_1 %40
+ %45 = OpAccessChain %_ptr_Function_int %var_for_index_1 %int_3
+ %46 = OpLoad %int %45
+ OpReturn
+ OpFunctionEnd
+%runtime_size_array = OpFunction %void None %6
+ %48 = OpLabel
+ %52 = OpAccessChain %_ptr_StorageBuffer_float %rarr %uint_0 %int_n1
+ %53 = OpLoad %float %52
+ OpReturn
+ OpFunctionEnd
+ %f = OpFunction %void None %6
+ %55 = OpLabel
+ %56 = OpFunctionCall %void %vector
+ %57 = OpFunctionCall %void %matrix
+ %58 = OpFunctionCall %void %fixed_size_array
+ %59 = OpFunctionCall %void %runtime_size_array
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/bug/tint/1666.wgsl.expected.wgsl b/test/tint/bug/tint/1666.wgsl.expected.wgsl
new file mode 100644
index 0000000..e6f5a2a
--- /dev/null
+++ b/test/tint/bug/tint/1666.wgsl.expected.wgsl
@@ -0,0 +1,30 @@
+fn vector() {
+ let idx = 3;
+ let x = vec2(1, 2)[idx];
+}
+
+fn matrix() {
+ let idx = 4;
+ let x = mat2x2(1, 2, 3, 4)[idx];
+}
+
+fn fixed_size_array() {
+ let arr = array(1, 2);
+ let idx = 3;
+ let x = arr[idx];
+}
+
+@group(0) @binding(0) var<storage> rarr : array<f32>;
+
+fn runtime_size_array() {
+ let idx = -1;
+ let x = rarr[idx];
+}
+
+@compute @workgroup_size(1)
+fn f() {
+ vector();
+ matrix();
+ fixed_size_array();
+ runtime_size_array();
+}