Add end-to-end test for tint:1112

I meant to add this to this CL:
https://dawn-review.googlesource.com/c/tint/+/69880

Bug: tint:1112
Change-Id: I7b5a3ab068ddbce1650a9e00609fed11e32db17d
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/70320
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
diff --git a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl
new file mode 100644
index 0000000..b4dff54
--- /dev/null
+++ b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl
@@ -0,0 +1,28 @@
+// 1112.wgsl

+[[group(0), binding(0)]] var Sampler: sampler;

+[[group(0), binding(1)]] var randomTexture: texture_2d<f32>;

+[[group(0), binding(2)]] var depthTexture: texture_2d<f32>;

+

+[[stage(fragment)]]

+fn main([[location(0)]] vUV : vec2<f32>) -> [[location(0)]] vec4<f32> {

+    let random: vec3<f32> = textureSample(randomTexture, Sampler, vUV).rgb;

+

+    var i = 0;

+    loop {

+        if (i < 1) {

+        } else {

+           break;

+        }

+        let offset : vec3<f32> = vec3<f32>(random.x);

+

+        if (offset.x < 0.0 || offset.y < 0.0 || offset.x > 1.0 || offset.y > 1.0) {

+            i = i + 1;

+            continue;

+        }

+

+        let sampleDepth : f32 = textureSample(depthTexture, Sampler, offset.xy).r;

+        i = i + 1;

+    }

+

+    return vec4<f32>(1.0);

+}

diff --git a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.hlsl b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.hlsl
new file mode 100644
index 0000000..4c8362a
--- /dev/null
+++ b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.hlsl
@@ -0,0 +1,48 @@
+SamplerState tint_symbol : register(s0, space0);
+Texture2D<float4> randomTexture : register(t1, space0);
+Texture2D<float4> depthTexture : register(t2, space0);
+
+struct tint_symbol_2 {
+  float2 vUV : TEXCOORD0;
+};
+struct tint_symbol_3 {
+  float4 value : SV_Target0;
+};
+
+float4 main_inner(float2 vUV) {
+  const float3 random = randomTexture.Sample(tint_symbol, vUV).rgb;
+  int i = 0;
+  [loop] while (true) {
+    if ((i < 1)) {
+    } else {
+      break;
+    }
+    const float3 offset = float3((random.x).xxx);
+    bool tint_tmp_2 = (offset.x < 0.0f);
+    if (!tint_tmp_2) {
+      tint_tmp_2 = (offset.y < 0.0f);
+    }
+    bool tint_tmp_1 = (tint_tmp_2);
+    if (!tint_tmp_1) {
+      tint_tmp_1 = (offset.x > 1.0f);
+    }
+    bool tint_tmp = (tint_tmp_1);
+    if (!tint_tmp) {
+      tint_tmp = (offset.y > 1.0f);
+    }
+    if ((tint_tmp)) {
+      i = (i + 1);
+      continue;
+    }
+    const float sampleDepth = depthTexture.Sample(tint_symbol, offset.xy).r;
+    i = (i + 1);
+  }
+  return float4((1.0f).xxxx);
+}
+
+tint_symbol_3 main(tint_symbol_2 tint_symbol_1) {
+  const float4 inner_result = main_inner(tint_symbol_1.vUV);
+  tint_symbol_3 wrapper_result = (tint_symbol_3)0;
+  wrapper_result.value = inner_result;
+  return wrapper_result;
+}
diff --git a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.msl b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.msl
new file mode 100644
index 0000000..7ac38ae
--- /dev/null
+++ b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.msl
@@ -0,0 +1,36 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_symbol_2 {
+  float2 vUV [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  float4 value [[color(0)]];
+};
+
+float4 tint_symbol_inner(float2 vUV, texture2d<float, access::sample> tint_symbol_4, sampler tint_symbol_5, texture2d<float, access::sample> tint_symbol_6) {
+  float3 const random = float4(tint_symbol_4.sample(tint_symbol_5, vUV)).rgb;
+  int i = 0;
+  while (true) {
+    if ((i < 1)) {
+    } else {
+      break;
+    }
+    float3 const offset = float3(random[0]);
+    if (((((offset[0] < 0.0f) || (offset[1] < 0.0f)) || (offset[0] > 1.0f)) || (offset[1] > 1.0f))) {
+      i = as_type<int>((as_type<uint>(i) + as_type<uint>(1)));
+      continue;
+    }
+    float const sampleDepth = tint_symbol_6.sample(tint_symbol_5, float3(offset).xy)[0];
+    i = as_type<int>((as_type<uint>(i) + as_type<uint>(1)));
+  }
+  return float4(1.0f);
+}
+
+fragment tint_symbol_3 tint_symbol(texture2d<float, access::sample> tint_symbol_7 [[texture(0)]], sampler tint_symbol_8 [[sampler(0)]], texture2d<float, access::sample> tint_symbol_9 [[texture(1)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  float4 const inner_result = tint_symbol_inner(tint_symbol_1.vUV, tint_symbol_7, tint_symbol_8, tint_symbol_9);
+  tint_symbol_3 wrapper_result = {};
+  wrapper_result.value = inner_result;
+  return wrapper_result;
+}
+
diff --git a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm
new file mode 100644
index 0000000..49aff3b
--- /dev/null
+++ b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm
@@ -0,0 +1,137 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 83
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %vUV_1 %value
+               OpExecutionMode %main OriginUpperLeft
+               OpName %vUV_1 "vUV_1"
+               OpName %value "value"
+               OpName %Sampler "Sampler"
+               OpName %randomTexture "randomTexture"
+               OpName %depthTexture "depthTexture"
+               OpName %main_inner "main_inner"
+               OpName %vUV "vUV"
+               OpName %i "i"
+               OpName %main "main"
+               OpDecorate %vUV_1 Location 0
+               OpDecorate %value Location 0
+               OpDecorate %Sampler DescriptorSet 0
+               OpDecorate %Sampler Binding 0
+               OpDecorate %randomTexture DescriptorSet 0
+               OpDecorate %randomTexture Binding 1
+               OpDecorate %depthTexture DescriptorSet 0
+               OpDecorate %depthTexture Binding 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+      %vUV_1 = OpVariable %_ptr_Input_v2float Input
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %8 = OpConstantNull %v4float
+      %value = OpVariable %_ptr_Output_v4float Output %8
+         %11 = OpTypeSampler
+%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
+    %Sampler = OpVariable %_ptr_UniformConstant_11 UniformConstant
+         %14 = OpTypeImage %float 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_14 = OpTypePointer UniformConstant %14
+%randomTexture = OpVariable %_ptr_UniformConstant_14 UniformConstant
+%depthTexture = OpVariable %_ptr_UniformConstant_14 UniformConstant
+         %16 = OpTypeFunction %v4float %v2float
+         %23 = OpTypeSampledImage %14
+    %v3float = OpTypeVector %float 3
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %76 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %void = OpTypeVoid
+         %77 = OpTypeFunction %void
+ %main_inner = OpFunction %v4float None %16
+        %vUV = OpFunctionParameter %v2float
+         %19 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %31
+         %21 = OpLoad %11 %Sampler
+         %22 = OpLoad %14 %randomTexture
+         %24 = OpSampledImage %23 %22 %21
+         %20 = OpImageSampleImplicitLod %v4float %24 %vUV
+         %26 = OpVectorShuffle %v3float %20 %20 0 1 2
+               OpStore %i %int_0
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %38 = OpSLessThan %bool %36 %int_1
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %33
+         %40 = OpLabel
+         %43 = OpCompositeExtract %float %26 0
+         %44 = OpCompositeConstruct %v3float %43 %43 %43
+         %45 = OpCompositeExtract %float %44 0
+         %47 = OpFOrdLessThan %bool %45 %float_0
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %48 %49
+         %49 = OpLabel
+         %50 = OpCompositeExtract %float %44 1
+         %51 = OpFOrdLessThan %bool %50 %float_0
+               OpBranch %48
+         %48 = OpLabel
+         %52 = OpPhi %bool %47 %40 %51 %49
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %53 %54
+         %54 = OpLabel
+         %55 = OpCompositeExtract %float %44 0
+         %57 = OpFOrdGreaterThan %bool %55 %float_1
+               OpBranch %53
+         %53 = OpLabel
+         %58 = OpPhi %bool %52 %48 %57 %54
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %59 %60
+         %60 = OpLabel
+         %61 = OpCompositeExtract %float %44 1
+         %62 = OpFOrdGreaterThan %bool %61 %float_1
+               OpBranch %59
+         %59 = OpLabel
+         %63 = OpPhi %bool %58 %53 %62 %60
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %i %67
+               OpBranch %34
+         %64 = OpLabel
+         %69 = OpLoad %11 %Sampler
+         %70 = OpLoad %14 %depthTexture
+         %71 = OpSampledImage %23 %70 %69
+         %72 = OpVectorShuffle %v2float %44 %44 0 1
+         %68 = OpImageSampleImplicitLod %v4float %71 %72
+         %73 = OpCompositeExtract %float %68 0
+         %74 = OpLoad %int %i
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %i %75
+               OpBranch %34
+         %34 = OpLabel
+               OpBranch %32
+         %33 = OpLabel
+               OpReturnValue %76
+               OpFunctionEnd
+       %main = OpFunction %void None %77
+         %80 = OpLabel
+         %82 = OpLoad %v2float %vUV_1
+         %81 = OpFunctionCall %v4float %main_inner %82
+               OpStore %value %81
+               OpReturn
+               OpFunctionEnd
diff --git a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl
new file mode 100644
index 0000000..6728e4e
--- /dev/null
+++ b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl
@@ -0,0 +1,25 @@
+[[group(0), binding(0)]] var Sampler : sampler;
+
+[[group(0), binding(1)]] var randomTexture : texture_2d<f32>;
+
+[[group(0), binding(2)]] var depthTexture : texture_2d<f32>;
+
+[[stage(fragment)]]
+fn main([[location(0)]] vUV : vec2<f32>) -> [[location(0)]] vec4<f32> {
+  let random : vec3<f32> = textureSample(randomTexture, Sampler, vUV).rgb;
+  var i = 0;
+  loop {
+    if ((i < 1)) {
+    } else {
+      break;
+    }
+    let offset : vec3<f32> = vec3<f32>(random.x);
+    if (((((offset.x < 0.0) || (offset.y < 0.0)) || (offset.x > 1.0)) || (offset.y > 1.0))) {
+      i = (i + 1);
+      continue;
+    }
+    let sampleDepth : f32 = textureSample(depthTexture, Sampler, offset.xy).r;
+    i = (i + 1);
+  }
+  return vec4<f32>(1.0);
+}