# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# A test for a bug found by GraphicsFuzz.

# Short description: A compute shader with an early return and a barrier

# Checks that the output value is 42.
# Passes because main always writes 42 to out_data.

# Optimized using spirv-opt with the following arguments:
# '-O'
# spirv-opt commit hash: a2ef7be242bcacaa9127a3ce011602ec54b2c9ed

# Derived from the following GLSL.

# Compute shader GLSL:
# #version 310 es
#
# precision highp float;
#
# layout(std430, binding = 0) buffer theSSBO {
#  int out_data;
# };
#
# layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
# void f(vec2 v)
# {
#  if(1.0 < v.x)
#   {
#    return;
#   }
#   barrier();
# }
# void main()
# {
#  out_data = 42;
#  mat2 m;
#  for(int i = 1; i > 0; i --)
#   {
#    m = mat2(1.0);
#   }
#  f(vec2(1.0) * (m - mat2(1.0)));
# }

[compute shader spirv]
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
; Bound: 87
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint GLCompute %4 "main"
               OpExecutionMode %4 LocalSize 1 1 1
               OpSource ESSL 310
               OpName %4 "main"
               OpName %27 "theSSBO"
               OpMemberName %27 0 "out_data"
               OpName %29 ""
               OpMemberDecorate %27 0 Offset 0
               OpDecorate %27 BufferBlock
               OpDecorate %29 DescriptorSet 0
               OpDecorate %29 Binding 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypeVector %6 2
         %13 = OpConstant %6 1
         %14 = OpTypeInt 32 0
         %19 = OpTypeBool
         %24 = OpConstant %14 2
         %25 = OpConstant %14 264
         %26 = OpTypeInt 32 1
         %27 = OpTypeStruct %26
         %28 = OpTypePointer Uniform %27
         %29 = OpVariable %28 Uniform
         %30 = OpConstant %26 0
         %31 = OpConstant %26 42
         %32 = OpTypePointer Uniform %26
         %36 = OpConstant %26 1
         %44 = OpTypeMatrix %7 2
         %47 = OpConstant %6 0
         %48 = OpConstantComposite %7 %13 %47
         %49 = OpConstantComposite %7 %47 %13
         %50 = OpConstantComposite %44 %48 %49
         %53 = OpConstantComposite %7 %13 %13
         %86 = OpUndef %44
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %33 = OpAccessChain %32 %29 %30
               OpStore %33 %31
               OpBranch %37
         %37 = OpLabel
         %85 = OpPhi %44 %86 %5 %50 %38
         %84 = OpPhi %26 %36 %5 %52 %38
         %43 = OpSGreaterThan %19 %84 %30
               OpLoopMerge %39 %38 None
               OpBranchConditional %43 %38 %39
         %38 = OpLabel
         %52 = OpISub %26 %84 %36
               OpBranch %37
         %39 = OpLabel
         %55 = OpCompositeExtract %7 %85 0
         %57 = OpFSub %7 %55 %48
         %58 = OpCompositeExtract %7 %85 1
         %60 = OpFSub %7 %58 %49
         %61 = OpCompositeConstruct %44 %57 %60
         %62 = OpVectorTimesMatrix %7 %53 %61
               OpBranch %74
         %74 = OpLabel
               OpLoopMerge %75 %76 None
               OpBranch %77
         %77 = OpLabel
         %79 = OpCompositeExtract %6 %62 0
         %80 = OpFOrdLessThan %19 %13 %79
               OpSelectionMerge %81 None
               OpBranchConditional %80 %82 %81
         %82 = OpLabel
               OpBranch %75
         %81 = OpLabel
               OpControlBarrier %24 %24 %25
               OpBranch %75
         %76 = OpLabel
               OpBranch %74
         %75 = OpLabel
               OpReturn
               OpFunctionEnd


[test]
## SSBO
ssbo 0 subdata int 0 0

compute 1 1 1
probe ssbo int 0 0 == 42
