Handle case where block is loop header, continue AND break block.
This commit is contained in:
parent
5ae9153a78
commit
542d460364
@ -0,0 +1,89 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
#ifndef SPIRV_CROSS_CONSTANT_ID_0
|
||||||
|
#define SPIRV_CROSS_CONSTANT_ID_0 1u
|
||||||
|
#endif
|
||||||
|
#ifndef SPIRV_CROSS_CONSTANT_ID_1
|
||||||
|
#define SPIRV_CROSS_CONSTANT_ID_1 1u
|
||||||
|
#endif
|
||||||
|
#ifndef SPIRV_CROSS_CONSTANT_ID_2
|
||||||
|
#define SPIRV_CROSS_CONSTANT_ID_2 1u
|
||||||
|
#endif
|
||||||
|
|
||||||
|
layout(local_size_x = SPIRV_CROSS_CONSTANT_ID_0, local_size_y = SPIRV_CROSS_CONSTANT_ID_1, local_size_z = SPIRV_CROSS_CONSTANT_ID_2) in;
|
||||||
|
|
||||||
|
layout(binding = 0, std430) buffer _4_6
|
||||||
|
{
|
||||||
|
float _m0[];
|
||||||
|
} _6;
|
||||||
|
|
||||||
|
layout(binding = 1, std430) buffer _4_7
|
||||||
|
{
|
||||||
|
float _m0[];
|
||||||
|
} _7;
|
||||||
|
|
||||||
|
uvec3 _28 = gl_WorkGroupSize;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
float _44_copy;
|
||||||
|
float _46;
|
||||||
|
uint _47;
|
||||||
|
float _63;
|
||||||
|
uint _65;
|
||||||
|
float _36 = _6._m0[0u];
|
||||||
|
uint _39 = 0u;
|
||||||
|
float _44;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
_44 = _36;
|
||||||
|
_46 = _6._m0[35u];
|
||||||
|
_47 = 0u;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
uint _48 = _47 + 1u;
|
||||||
|
float _45 = _6._m0[_48];
|
||||||
|
_6._m0[_47] = ((_46 + _44) + _45) / 3.0;
|
||||||
|
if (!(_47 < 34u))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_44_copy = _44;
|
||||||
|
_44 = _45;
|
||||||
|
_46 = _44_copy;
|
||||||
|
_47 = _48;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_6._m0[35u] = (_36 + (_44 + _6._m0[35u])) / 3.0;
|
||||||
|
if (!(_39 < 5u))
|
||||||
|
{
|
||||||
|
_63 = _6._m0[0u];
|
||||||
|
_65 = 1u;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_36 = _6._m0[0u];
|
||||||
|
_39++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
float _64;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
_64 = (_63 < _6._m0[_65]) ? _6._m0[_65] : _63;
|
||||||
|
if (!(_65 < 35u))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_63 = _64;
|
||||||
|
_65++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_7._m0[gl_GlobalInvocationID.x] = _64;
|
||||||
|
}
|
||||||
|
|
109
shaders-no-opt/asm/loop-header-self-continue-break.asm.comp
Normal file
109
shaders-no-opt/asm/loop-header-self-continue-break.asm.comp
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
; SPIR-V
|
||||||
|
; Version: 1.0
|
||||||
|
; Generator: Google Clspv; 0
|
||||||
|
; Bound: 83
|
||||||
|
; Schema: 0
|
||||||
|
OpCapability Shader
|
||||||
|
OpExtension "SPV_KHR_storage_buffer_storage_class"
|
||||||
|
OpMemoryModel Logical GLSL450
|
||||||
|
OpEntryPoint GLCompute %19 "main" %gl_GlobalInvocationID
|
||||||
|
OpSource OpenCL_C 120
|
||||||
|
OpDecorate %_runtimearr_float ArrayStride 4
|
||||||
|
OpMemberDecorate %_struct_3 0 Offset 0
|
||||||
|
OpDecorate %_struct_3 Block
|
||||||
|
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
|
||||||
|
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
|
||||||
|
OpDecorate %15 DescriptorSet 0
|
||||||
|
OpDecorate %15 Binding 0
|
||||||
|
OpDecorate %16 DescriptorSet 0
|
||||||
|
OpDecorate %16 Binding 1
|
||||||
|
OpDecorate %10 SpecId 0
|
||||||
|
OpDecorate %11 SpecId 1
|
||||||
|
OpDecorate %12 SpecId 2
|
||||||
|
%float = OpTypeFloat 32
|
||||||
|
%_runtimearr_float = OpTypeRuntimeArray %float
|
||||||
|
%_struct_3 = OpTypeStruct %_runtimearr_float
|
||||||
|
%_ptr_StorageBuffer__struct_3 = OpTypePointer StorageBuffer %_struct_3
|
||||||
|
%uint = OpTypeInt 32 0
|
||||||
|
%v3uint = OpTypeVector %uint 3
|
||||||
|
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
|
||||||
|
%_ptr_Private_v3uint = OpTypePointer Private %v3uint
|
||||||
|
%10 = OpSpecConstant %uint 1
|
||||||
|
%11 = OpSpecConstant %uint 1
|
||||||
|
%12 = OpSpecConstant %uint 1
|
||||||
|
%gl_WorkGroupSize = OpSpecConstantComposite %v3uint %10 %11 %12
|
||||||
|
%void = OpTypeVoid
|
||||||
|
%18 = OpTypeFunction %void
|
||||||
|
%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
|
||||||
|
%uint_0 = OpConstant %uint 0
|
||||||
|
%_ptr_Input_uint = OpTypePointer Input %uint
|
||||||
|
%uint_35 = OpConstant %uint 35
|
||||||
|
%uint_1 = OpConstant %uint 1
|
||||||
|
%float_3 = OpConstant %float 3
|
||||||
|
%bool = OpTypeBool
|
||||||
|
%uint_34 = OpConstant %uint 34
|
||||||
|
%uint_5 = OpConstant %uint 5
|
||||||
|
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
|
||||||
|
%14 = OpVariable %_ptr_Private_v3uint Private %gl_WorkGroupSize
|
||||||
|
%15 = OpVariable %_ptr_StorageBuffer__struct_3 StorageBuffer
|
||||||
|
%16 = OpVariable %_ptr_StorageBuffer__struct_3 StorageBuffer
|
||||||
|
%19 = OpFunction %void None %18
|
||||||
|
%20 = OpLabel
|
||||||
|
%23 = OpAccessChain %_ptr_StorageBuffer_float %15 %uint_0 %uint_0
|
||||||
|
%25 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
|
||||||
|
%26 = OpLoad %uint %25
|
||||||
|
%27 = OpLoad %float %23
|
||||||
|
%29 = OpAccessChain %_ptr_StorageBuffer_float %15 %uint_0 %uint_35
|
||||||
|
OpBranch %31
|
||||||
|
%31 = OpLabel
|
||||||
|
%32 = OpPhi %float %27 %20 %67 %58
|
||||||
|
%33 = OpPhi %uint %uint_0 %20 %63 %58
|
||||||
|
%34 = OpLoad %float %29
|
||||||
|
OpLoopMerge %69 %58 None
|
||||||
|
OpBranch %37
|
||||||
|
%37 = OpLabel
|
||||||
|
%38 = OpPhi %float %46 %37 %32 %31
|
||||||
|
%39 = OpPhi %float %38 %37 %34 %31
|
||||||
|
%40 = OpPhi %uint %44 %37 %uint_0 %31
|
||||||
|
%41 = OpAccessChain %_ptr_StorageBuffer_float %15 %uint_0 %40
|
||||||
|
%42 = OpFAdd %float %39 %38
|
||||||
|
%44 = OpIAdd %uint %40 %uint_1
|
||||||
|
%45 = OpAccessChain %_ptr_StorageBuffer_float %15 %uint_0 %44
|
||||||
|
%46 = OpLoad %float %45
|
||||||
|
%47 = OpFAdd %float %42 %46
|
||||||
|
%49 = OpFDiv %float %47 %float_3
|
||||||
|
OpStore %41 %49
|
||||||
|
%52 = OpULessThan %bool %40 %uint_34
|
||||||
|
%53 = OpLogicalNot %bool %52
|
||||||
|
OpLoopMerge %56 %37 None
|
||||||
|
OpBranchConditional %53 %56 %37
|
||||||
|
%56 = OpLabel
|
||||||
|
OpBranch %58
|
||||||
|
%58 = OpLabel
|
||||||
|
%59 = OpLoad %float %29
|
||||||
|
%60 = OpFAdd %float %38 %59
|
||||||
|
%61 = OpFAdd %float %32 %60
|
||||||
|
%62 = OpFDiv %float %61 %float_3
|
||||||
|
OpStore %29 %62
|
||||||
|
%63 = OpIAdd %uint %33 %uint_1
|
||||||
|
%65 = OpULessThan %bool %33 %uint_5
|
||||||
|
%66 = OpLogicalNot %bool %65
|
||||||
|
%67 = OpLoad %float %23
|
||||||
|
OpBranchConditional %66 %69 %31
|
||||||
|
%69 = OpLabel
|
||||||
|
%70 = OpPhi %float %75 %69 %67 %58
|
||||||
|
%71 = OpPhi %uint %76 %69 %uint_1 %58
|
||||||
|
%72 = OpAccessChain %_ptr_StorageBuffer_float %15 %uint_0 %71
|
||||||
|
%73 = OpLoad %float %72
|
||||||
|
%74 = OpFOrdLessThan %bool %70 %73
|
||||||
|
%75 = OpSelect %float %74 %73 %70
|
||||||
|
%76 = OpIAdd %uint %71 %uint_1
|
||||||
|
%77 = OpULessThan %bool %71 %uint_35
|
||||||
|
%78 = OpLogicalNot %bool %77
|
||||||
|
OpLoopMerge %81 %69 None
|
||||||
|
OpBranchConditional %78 %81 %69
|
||||||
|
%81 = OpLabel
|
||||||
|
%82 = OpAccessChain %_ptr_StorageBuffer_float %16 %uint_0 %26
|
||||||
|
OpStore %82 %75
|
||||||
|
OpReturn
|
||||||
|
OpFunctionEnd
|
@ -13253,8 +13253,14 @@ void CompilerGLSL::branch(BlockID from, BlockID to)
|
|||||||
// and end the chain here.
|
// and end the chain here.
|
||||||
statement("continue;");
|
statement("continue;");
|
||||||
}
|
}
|
||||||
else if (is_break(to))
|
else if (from != to && is_break(to))
|
||||||
{
|
{
|
||||||
|
// We cannot break to ourselves, so check explicitly for from != to.
|
||||||
|
// This case can trigger if a loop header is all three of these things:
|
||||||
|
// - Continue block
|
||||||
|
// - Loop header
|
||||||
|
// - Break merge target all at once ...
|
||||||
|
|
||||||
// Very dirty workaround.
|
// Very dirty workaround.
|
||||||
// Switch constructs are able to break, but they cannot break out of a loop at the same time.
|
// Switch constructs are able to break, but they cannot break out of a loop at the same time.
|
||||||
// Only sensible solution is to make a ladder variable, which we declare at the top of the switch block,
|
// Only sensible solution is to make a ladder variable, which we declare at the top of the switch block,
|
||||||
|
Loading…
Reference in New Issue
Block a user