diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index b15a19f0..bf26cdcf 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -1748,42 +1748,94 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt } } +// This path handles both if-then-else and ?: +// The if-then-else has a node type of void, while +// ?: has either a void or a non-void node type +// +// Leaving the result, when not void: +// GLSL only has r-values as the result of a :?, but +// if we have an l-value, that can be more efficient if it will +// become the base of a complex r-value expression, because the +// next layer copies r-values into memory to use the access-chain mechanism bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang::TIntermSelection* node) { - // This path handles both if-then-else and ?: - // The if-then-else has a node type of void, while - // ?: has a non-void node type - spv::Id result = 0; - if (node->getBasicType() != glslang::EbtVoid) { - // don't handle this as just on-the-fly temporaries, because there will be two names - // and better to leave SSA to later passes - result = builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(node->getType())); + // See if it simple and safe to generate OpSelect instead of using control flow. + // Crucially, side effects must be avoided, and there are performance trade-offs. + // Return true if good idea (and safe) for OpSelect, false otherwise. + const auto selectPolicy = [&]() -> bool { + if (node->getBasicType() == glslang::EbtVoid) + return false; + + if (node->getTrueBlock() == nullptr || + node->getFalseBlock() == nullptr) + return false; + + assert(node->getType() == node->getTrueBlock() ->getAsTyped()->getType() && + node->getType() == node->getFalseBlock()->getAsTyped()->getType()); + + // return true if a single operand to ? : is okay for OpSelect + const auto operandOkay = [](glslang::TIntermTyped* node) { + return node->getAsSymbolNode() || node->getAsConstantUnion(); + }; + + return operandOkay(node->getTrueBlock() ->getAsTyped()) && + operandOkay(node->getFalseBlock()->getAsTyped()); + }; + + // Emit OpSelect for this selection. + const auto handleAsOpSelect = [&]() { + node->getCondition()->traverse(this); + spv::Id condition = accessChainLoad(node->getCondition()->getType()); + node->getTrueBlock()->traverse(this); + spv::Id trueValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()); + node->getFalseBlock()->traverse(this); + spv::Id falseValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()); + + spv::Id select = builder.createTriOp(spv::OpSelect, convertGlslangToSpvType(node->getType()), condition, trueValue, falseValue); + builder.clearAccessChain(); + builder.setAccessChainRValue(select); + }; + + // Try for OpSelect + + if (selectPolicy()) { + handleAsOpSelect(); + return false; } + // Instead, emit control flow... + + // Don't handle results as temporaries, because there will be two names + // and better to leave SSA to later passes. + spv::Id result = (node->getBasicType() == glslang::EbtVoid) + ? spv::NoResult + : builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(node->getType())); + // emit the condition before doing anything with selection node->getCondition()->traverse(this); // make an "if" based on the value created by the condition spv::Builder::If ifBuilder(accessChainLoad(node->getCondition()->getType()), builder); - if (node->getTrueBlock()) { - // emit the "then" statement + // emit the "then" statement + if (node->getTrueBlock() != nullptr) { node->getTrueBlock()->traverse(this); - if (result) - builder.createStore(accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()), result); + if (result != spv::NoResult) + builder.createStore(accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()), result); } - if (node->getFalseBlock()) { + if (node->getFalseBlock() != nullptr) { ifBuilder.makeBeginElse(); // emit the "else" statement node->getFalseBlock()->traverse(this); - if (result) + if (result != spv::NoResult) builder.createStore(accessChainLoad(node->getFalseBlock()->getAsTyped()->getType()), result); } + // finish off the control flow ifBuilder.makeEndIf(); - if (result) { + if (result != spv::NoResult) { // GLSL only has r-values as the result of a :?, but // if we have an l-value, that can be more efficient if it will // become the base of a complex r-value expression, because the diff --git a/Test/baseResults/spv.140.frag.out b/Test/baseResults/spv.140.frag.out index f8e75ebd..d8ec8cfb 100755 --- a/Test/baseResults/spv.140.frag.out +++ b/Test/baseResults/spv.140.frag.out @@ -1,7 +1,7 @@ spv.140.frag // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 101 +// Id's are bound by 96 Capability Shader Capability ClipDistance @@ -10,168 +10,157 @@ spv.140.frag Capability ImageQuery 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 16 28 33 43 + EntryPoint Fragment 4 "main" 14 23 28 38 ExecutionMode 4 OriginUpperLeft Source GLSL 140 Name 4 "main" Name 8 "foo(" Name 11 "i1" - Name 16 "gl_FrontFacing" - Name 24 "i2" - Name 28 "o" - Name 33 "gl_ClipDistance" - Name 43 "k" - Name 55 "sampR" - Name 63 "sampB" - Name 87 "samp2Da" - Name 92 "bn" - MemberName 92(bn) 0 "matra" - MemberName 92(bn) 1 "matca" - MemberName 92(bn) 2 "matr" - MemberName 92(bn) 3 "matc" - MemberName 92(bn) 4 "matrdef" - Name 94 "" - Name 97 "bi" - MemberName 97(bi) 0 "v" - Name 100 "bname" - Decorate 16(gl_FrontFacing) BuiltIn FrontFacing - Decorate 33(gl_ClipDistance) BuiltIn ClipDistance - Decorate 55(sampR) DescriptorSet 0 - Decorate 63(sampB) DescriptorSet 0 - Decorate 87(samp2Da) DescriptorSet 0 - Decorate 90 ArrayStride 64 - Decorate 91 ArrayStride 64 - MemberDecorate 92(bn) 0 RowMajor - MemberDecorate 92(bn) 0 Offset 0 - MemberDecorate 92(bn) 0 MatrixStride 16 - MemberDecorate 92(bn) 1 ColMajor - MemberDecorate 92(bn) 1 Offset 256 - MemberDecorate 92(bn) 1 MatrixStride 16 - MemberDecorate 92(bn) 2 RowMajor - MemberDecorate 92(bn) 2 Offset 512 - MemberDecorate 92(bn) 2 MatrixStride 16 - MemberDecorate 92(bn) 3 ColMajor - MemberDecorate 92(bn) 3 Offset 576 - MemberDecorate 92(bn) 3 MatrixStride 16 - MemberDecorate 92(bn) 4 RowMajor - MemberDecorate 92(bn) 4 Offset 640 - MemberDecorate 92(bn) 4 MatrixStride 16 - Decorate 92(bn) Block - Decorate 94 DescriptorSet 0 - Decorate 96 ArrayStride 16 - MemberDecorate 97(bi) 0 Offset 0 - Decorate 97(bi) Block - Decorate 100(bname) DescriptorSet 0 + Name 14 "gl_FrontFacing" + Name 19 "i2" + Name 23 "o" + Name 28 "gl_ClipDistance" + Name 38 "k" + Name 50 "sampR" + Name 58 "sampB" + Name 82 "samp2Da" + Name 87 "bn" + MemberName 87(bn) 0 "matra" + MemberName 87(bn) 1 "matca" + MemberName 87(bn) 2 "matr" + MemberName 87(bn) 3 "matc" + MemberName 87(bn) 4 "matrdef" + Name 89 "" + Name 92 "bi" + MemberName 92(bi) 0 "v" + Name 95 "bname" + Decorate 14(gl_FrontFacing) BuiltIn FrontFacing + Decorate 28(gl_ClipDistance) BuiltIn ClipDistance + Decorate 50(sampR) DescriptorSet 0 + Decorate 58(sampB) DescriptorSet 0 + Decorate 82(samp2Da) DescriptorSet 0 + Decorate 85 ArrayStride 64 + Decorate 86 ArrayStride 64 + MemberDecorate 87(bn) 0 RowMajor + MemberDecorate 87(bn) 0 Offset 0 + MemberDecorate 87(bn) 0 MatrixStride 16 + MemberDecorate 87(bn) 1 ColMajor + MemberDecorate 87(bn) 1 Offset 256 + MemberDecorate 87(bn) 1 MatrixStride 16 + MemberDecorate 87(bn) 2 RowMajor + MemberDecorate 87(bn) 2 Offset 512 + MemberDecorate 87(bn) 2 MatrixStride 16 + MemberDecorate 87(bn) 3 ColMajor + MemberDecorate 87(bn) 3 Offset 576 + MemberDecorate 87(bn) 3 MatrixStride 16 + MemberDecorate 87(bn) 4 RowMajor + MemberDecorate 87(bn) 4 Offset 640 + MemberDecorate 87(bn) 4 MatrixStride 16 + Decorate 87(bn) Block + Decorate 89 DescriptorSet 0 + Decorate 91 ArrayStride 16 + MemberDecorate 92(bi) 0 Offset 0 + Decorate 92(bi) Block + Decorate 95(bname) DescriptorSet 0 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 7: TypeFunction 6(float) 10: TypePointer Private 6(float) 11(i1): 10(ptr) Variable Private - 12: TypePointer Function 6(float) - 14: TypeBool - 15: TypePointer Input 14(bool) -16(gl_FrontFacing): 15(ptr) Variable Input - 20: 6(float) Constant 3221225472 - 22: 6(float) Constant 1073741824 - 24(i2): 10(ptr) Variable Private - 25: 6(float) Constant 1120665600 - 26: TypeVector 6(float) 4 - 27: TypePointer Output 26(fvec4) - 28(o): 27(ptr) Variable Output - 29: TypeInt 32 0 - 30: 29(int) Constant 5 - 31: TypeArray 6(float) 30 - 32: TypePointer Input 31 -33(gl_ClipDistance): 32(ptr) Variable Input - 34: TypeInt 32 1 - 35: 34(int) Constant 2 - 36: TypePointer Input 6(float) - 39: 29(int) Constant 1 - 40: TypePointer Output 6(float) - 42: TypePointer Input 26(fvec4) - 43(k): 42(ptr) Variable Input - 45: TypeVector 34(int) 4 - 50: 29(int) Constant 2 - 52: TypeImage 6(float) Rect sampled format:Unknown - 53: TypeSampledImage 52 - 54: TypePointer UniformConstant 53 - 55(sampR): 54(ptr) Variable UniformConstant - 58: TypeVector 34(int) 2 - 60: TypeImage 34(int) Buffer sampled format:Unknown - 61: TypeSampledImage 60 - 62: TypePointer UniformConstant 61 - 63(sampB): 62(ptr) Variable UniformConstant - 69: TypeVector 6(float) 2 - 72: 6(float) Constant 1120403456 - 74: 29(int) Constant 3 - 83: TypeImage 6(float) 2D sampled format:Unknown - 84: TypeSampledImage 83 - 85: TypeArray 84 74 - 86: TypePointer UniformConstant 85 - 87(samp2Da): 86(ptr) Variable UniformConstant - 88: TypeMatrix 26(fvec4) 4 - 89: 29(int) Constant 4 - 90: TypeArray 88 89 - 91: TypeArray 88 89 - 92(bn): TypeStruct 90 91 88 88 88 - 93: TypePointer Uniform 92(bn) - 94: 93(ptr) Variable Uniform - 95: TypeVector 6(float) 3 - 96: TypeArray 95(fvec3) 50 - 97(bi): TypeStruct 96 - 98: TypeArray 97(bi) 89 - 99: TypePointer Uniform 98 - 100(bname): 99(ptr) Variable Uniform + 12: TypeBool + 13: TypePointer Input 12(bool) +14(gl_FrontFacing): 13(ptr) Variable Input + 16: 6(float) Constant 3221225472 + 17: 6(float) Constant 1073741824 + 19(i2): 10(ptr) Variable Private + 20: 6(float) Constant 1120665600 + 21: TypeVector 6(float) 4 + 22: TypePointer Output 21(fvec4) + 23(o): 22(ptr) Variable Output + 24: TypeInt 32 0 + 25: 24(int) Constant 5 + 26: TypeArray 6(float) 25 + 27: TypePointer Input 26 +28(gl_ClipDistance): 27(ptr) Variable Input + 29: TypeInt 32 1 + 30: 29(int) Constant 2 + 31: TypePointer Input 6(float) + 34: 24(int) Constant 1 + 35: TypePointer Output 6(float) + 37: TypePointer Input 21(fvec4) + 38(k): 37(ptr) Variable Input + 40: TypeVector 29(int) 4 + 45: 24(int) Constant 2 + 47: TypeImage 6(float) Rect sampled format:Unknown + 48: TypeSampledImage 47 + 49: TypePointer UniformConstant 48 + 50(sampR): 49(ptr) Variable UniformConstant + 53: TypeVector 29(int) 2 + 55: TypeImage 29(int) Buffer sampled format:Unknown + 56: TypeSampledImage 55 + 57: TypePointer UniformConstant 56 + 58(sampB): 57(ptr) Variable UniformConstant + 64: TypeVector 6(float) 2 + 67: 6(float) Constant 1120403456 + 69: 24(int) Constant 3 + 78: TypeImage 6(float) 2D sampled format:Unknown + 79: TypeSampledImage 78 + 80: TypeArray 79 69 + 81: TypePointer UniformConstant 80 + 82(samp2Da): 81(ptr) Variable UniformConstant + 83: TypeMatrix 21(fvec4) 4 + 84: 24(int) Constant 4 + 85: TypeArray 83 84 + 86: TypeArray 83 84 + 87(bn): TypeStruct 85 86 83 83 83 + 88: TypePointer Uniform 87(bn) + 89: 88(ptr) Variable Uniform + 90: TypeVector 6(float) 3 + 91: TypeArray 90(fvec3) 45 + 92(bi): TypeStruct 91 + 93: TypeArray 92(bi) 84 + 94: TypePointer Uniform 93 + 95(bname): 94(ptr) Variable Uniform 4(main): 2 Function None 3 5: Label - 13: 12(ptr) Variable Function - 17: 14(bool) Load 16(gl_FrontFacing) - SelectionMerge 19 None - BranchConditional 17 18 21 - 18: Label - Store 13 20 - Branch 19 - 21: Label - Store 13 22 - Branch 19 - 19: Label - 23: 6(float) Load 13 - Store 11(i1) 23 - Store 24(i2) 25 - 37: 36(ptr) AccessChain 33(gl_ClipDistance) 35 - 38: 6(float) Load 37 - 41: 40(ptr) AccessChain 28(o) 39 - Store 41 38 - 44: 26(fvec4) Load 43(k) - 46: 45(ivec4) ConvertFToS 44 - 47: 34(int) CompositeExtract 46 0 - 48: 36(ptr) AccessChain 33(gl_ClipDistance) 47 - 49: 6(float) Load 48 - 51: 40(ptr) AccessChain 28(o) 50 - Store 51 49 - 56: 53 Load 55(sampR) - 57: 52 Image 56 - 59: 58(ivec2) ImageQuerySize 57 - 64: 61 Load 63(sampB) - 65: 60 Image 64 - 66: 34(int) ImageQuerySize 65 - 67: 58(ivec2) CompositeConstruct 66 66 - 68: 58(ivec2) IAdd 59 67 - 70: 69(fvec2) ConvertSToF 68 - 71: 6(float) CompositeExtract 70 0 - 73: 6(float) FDiv 71 72 - 75: 40(ptr) AccessChain 28(o) 74 - Store 75 73 - 76: 6(float) FunctionCall 8(foo() - 77: 40(ptr) AccessChain 28(o) 50 - Store 77 76 + 15: 12(bool) Load 14(gl_FrontFacing) + 18: 6(float) Select 15 16 17 + Store 11(i1) 18 + Store 19(i2) 20 + 32: 31(ptr) AccessChain 28(gl_ClipDistance) 30 + 33: 6(float) Load 32 + 36: 35(ptr) AccessChain 23(o) 34 + Store 36 33 + 39: 21(fvec4) Load 38(k) + 41: 40(ivec4) ConvertFToS 39 + 42: 29(int) CompositeExtract 41 0 + 43: 31(ptr) AccessChain 28(gl_ClipDistance) 42 + 44: 6(float) Load 43 + 46: 35(ptr) AccessChain 23(o) 45 + Store 46 44 + 51: 48 Load 50(sampR) + 52: 47 Image 51 + 54: 53(ivec2) ImageQuerySize 52 + 59: 56 Load 58(sampB) + 60: 55 Image 59 + 61: 29(int) ImageQuerySize 60 + 62: 53(ivec2) CompositeConstruct 61 61 + 63: 53(ivec2) IAdd 54 62 + 65: 64(fvec2) ConvertSToF 63 + 66: 6(float) CompositeExtract 65 0 + 68: 6(float) FDiv 66 67 + 70: 35(ptr) AccessChain 23(o) 69 + Store 70 68 + 71: 6(float) FunctionCall 8(foo() + 72: 35(ptr) AccessChain 23(o) 45 + Store 72 71 Return FunctionEnd 8(foo(): 6(float) Function None 7 9: Label - 78: 6(float) Load 11(i1) - 79: 6(float) Load 24(i2) - 80: 6(float) FAdd 78 79 - ReturnValue 80 + 73: 6(float) Load 11(i1) + 74: 6(float) Load 19(i2) + 75: 6(float) FAdd 73 74 + ReturnValue 75 FunctionEnd diff --git a/Test/baseResults/spv.bool.vert.out b/Test/baseResults/spv.bool.vert.out index f84687a5..2810ff1e 100644 --- a/Test/baseResults/spv.bool.vert.out +++ b/Test/baseResults/spv.bool.vert.out @@ -3,7 +3,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 49 +// Id's are bound by 44 Capability Shader 1: ExtInstImport "GLSL.std.450" @@ -19,18 +19,18 @@ Warning, version 450 is not yet complete; most version-specific features are pre MemberName 22(gl_PerVertex) 2 "gl_ClipDistance" MemberName 22(gl_PerVertex) 3 "gl_CullDistance" Name 24 "" - Name 29 "ubname" - MemberName 29(ubname) 0 "b" - Name 31 "ubinst" - Name 32 "param" + Name 27 "ubname" + MemberName 27(ubname) 0 "b" + Name 29 "ubinst" + Name 30 "param" MemberDecorate 22(gl_PerVertex) 0 BuiltIn Position MemberDecorate 22(gl_PerVertex) 1 BuiltIn PointSize MemberDecorate 22(gl_PerVertex) 2 BuiltIn ClipDistance MemberDecorate 22(gl_PerVertex) 3 BuiltIn CullDistance Decorate 22(gl_PerVertex) Block - MemberDecorate 29(ubname) 0 Offset 0 - Decorate 29(ubname) Block - Decorate 31(ubinst) DescriptorSet 0 + MemberDecorate 27(ubname) 0 Offset 0 + Decorate 27(ubname) Block + Decorate 29(ubinst) DescriptorSet 0 2: TypeVoid 3: TypeFunction 2 6: TypeBool @@ -47,38 +47,27 @@ Warning, version 450 is not yet complete; most version-specific features are pre 24: 23(ptr) Variable Output 25: TypeInt 32 1 26: 25(int) Constant 0 - 27: TypePointer Function 18(fvec4) - 29(ubname): TypeStruct 19(int) - 30: TypePointer Uniform 29(ubname) - 31(ubinst): 30(ptr) Variable Uniform - 33: TypePointer Uniform 19(int) - 36: 19(int) Constant 0 - 41: 17(float) Constant 0 - 42: 18(fvec4) ConstantComposite 41 41 41 41 - 44: 17(float) Constant 1065353216 - 45: 18(fvec4) ConstantComposite 44 44 44 44 - 47: TypePointer Output 18(fvec4) + 27(ubname): TypeStruct 19(int) + 28: TypePointer Uniform 27(ubname) + 29(ubinst): 28(ptr) Variable Uniform + 31: TypePointer Uniform 19(int) + 34: 19(int) Constant 0 + 37: 17(float) Constant 0 + 38: 18(fvec4) ConstantComposite 37 37 37 37 + 39: 17(float) Constant 1065353216 + 40: 18(fvec4) ConstantComposite 39 39 39 39 + 42: TypePointer Output 18(fvec4) 4(main): 2 Function None 3 5: Label - 28: 27(ptr) Variable Function - 32(param): 7(ptr) Variable Function - 34: 33(ptr) AccessChain 31(ubinst) 26 - 35: 19(int) Load 34 - 37: 6(bool) INotEqual 35 36 - Store 32(param) 37 - 38: 6(bool) FunctionCall 10(foo(b1;) 32(param) - SelectionMerge 40 None - BranchConditional 38 39 43 - 39: Label - Store 28 42 - Branch 40 - 43: Label - Store 28 45 - Branch 40 - 40: Label - 46: 18(fvec4) Load 28 - 48: 47(ptr) AccessChain 24 26 - Store 48 46 + 30(param): 7(ptr) Variable Function + 32: 31(ptr) AccessChain 29(ubinst) 26 + 33: 19(int) Load 32 + 35: 6(bool) INotEqual 33 34 + Store 30(param) 35 + 36: 6(bool) FunctionCall 10(foo(b1;) 30(param) + 41: 18(fvec4) Select 36 38 40 + 43: 42(ptr) AccessChain 24 26 + Store 43 41 Return FunctionEnd 10(foo(b1;): 6(bool) Function None 8 diff --git a/Test/baseResults/spv.deepRvalue.frag.out b/Test/baseResults/spv.deepRvalue.frag.out index 29cf8488..b6613ef5 100644 --- a/Test/baseResults/spv.deepRvalue.frag.out +++ b/Test/baseResults/spv.deepRvalue.frag.out @@ -1,12 +1,12 @@ spv.deepRvalue.frag // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 155 +// Id's are bound by 150 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 149 + EntryPoint Fragment 4 "main" 144 ExecutionMode 4 OriginUpperLeft Source GLSL 330 Name 4 "main" @@ -21,12 +21,12 @@ spv.deepRvalue.frag Name 106 "h" Name 107 "i" Name 111 "samp2D" - Name 134 "str" - MemberName 134(str) 0 "a" - MemberName 134(str) 1 "b" - MemberName 134(str) 2 "c" - Name 136 "t" - Name 149 "gl_FragColor" + Name 129 "str" + MemberName 129(str) 0 "a" + MemberName 129(str) 1 "b" + MemberName 129(str) 2 "c" + Name 131 "t" + Name 144 "gl_FragColor" Decorate 111(samp2D) DescriptorSet 0 2: TypeVoid 3: TypeFunction 2 @@ -75,22 +75,21 @@ spv.deepRvalue.frag 113: TypeVector 6(float) 2 114: 6(float) Constant 1056964608 115: 113(fvec2) ConstantComposite 114 114 - 118: TypePointer Function 7(fvec4) - 121: 6(float) Constant 1036831949 - 122: TypeBool - 133: TypeArray 113(fvec2) 84 - 134(str): TypeStruct 81(int) 133 122(bool) - 135: TypePointer Function 134(str) - 137: 113(fvec2) ConstantComposite 10 11 - 138: 6(float) Constant 1082130432 - 139: 113(fvec2) ConstantComposite 138 12 - 140: 6(float) Constant 1086324736 - 141: 113(fvec2) ConstantComposite 140 13 - 142: 133 ConstantComposite 137 139 141 - 143: 122(bool) ConstantTrue - 144: 134(str) ConstantComposite 82 142 143 - 148: TypePointer Output 7(fvec4) -149(gl_FragColor): 148(ptr) Variable Output + 119: 6(float) Constant 1036831949 + 120: TypeBool + 128: TypeArray 113(fvec2) 84 + 129(str): TypeStruct 81(int) 128 120(bool) + 130: TypePointer Function 129(str) + 132: 113(fvec2) ConstantComposite 10 11 + 133: 6(float) Constant 1082130432 + 134: 113(fvec2) ConstantComposite 133 12 + 135: 6(float) Constant 1086324736 + 136: 113(fvec2) ConstantComposite 135 13 + 137: 128 ConstantComposite 132 134 136 + 138: 120(bool) ConstantTrue + 139: 129(str) ConstantComposite 82 137 138 + 143: TypePointer Output 7(fvec4) +144(gl_FragColor): 143(ptr) Variable Output 4(main): 2 Function None 3 5: Label 35(m): 34(ptr) Variable Function @@ -99,8 +98,7 @@ spv.deepRvalue.frag 87(g): 79(ptr) Variable Function 106(h): 79(ptr) Variable Function 107(i): 79(ptr) Variable Function - 119: 118(ptr) Variable Function - 136(t): 135(ptr) Variable Function + 131(t): 130(ptr) Variable Function Store 9(v1) 14 Store 15(v2) 20 Store 21(v3) 26 @@ -172,34 +170,25 @@ spv.deepRvalue.frag 116: 7(fvec4) ImageSampleImplicitLod 112 115 117: 6(float) CompositeExtract 116 1 Store 107(i) 117 - 120: 6(float) Load 107(i) - 123: 122(bool) FOrdGreaterThan 120 121 - SelectionMerge 125 None - BranchConditional 123 124 127 - 124: Label - 126: 7(fvec4) Load 9(v1) - Store 119 126 - Branch 125 - 127: Label - 128: 7(fvec4) Load 15(v2) - Store 119 128 - Branch 125 - 125: Label - 129: 79(ptr) AccessChain 119 84 - 130: 6(float) Load 129 - 131: 6(float) Load 107(i) - 132: 6(float) FAdd 131 130 - Store 107(i) 132 - Store 136(t) 144 - 145: 6(float) CompositeExtract 144 1 2 1 - 146: 6(float) Load 107(i) - 147: 6(float) FAdd 146 145 - Store 107(i) 147 - 150: 6(float) Load 80(f) - 151: 6(float) Load 87(g) - 152: 6(float) Load 106(h) - 153: 6(float) Load 107(i) - 154: 7(fvec4) CompositeConstruct 150 151 152 153 - Store 149(gl_FragColor) 154 + 118: 6(float) Load 107(i) + 121: 120(bool) FOrdGreaterThan 118 119 + 122: 7(fvec4) Load 9(v1) + 123: 7(fvec4) Load 15(v2) + 124: 7(fvec4) Select 121 122 123 + 125: 6(float) CompositeExtract 124 3 + 126: 6(float) Load 107(i) + 127: 6(float) FAdd 126 125 + Store 107(i) 127 + Store 131(t) 139 + 140: 6(float) CompositeExtract 139 1 2 1 + 141: 6(float) Load 107(i) + 142: 6(float) FAdd 141 140 + Store 107(i) 142 + 145: 6(float) Load 80(f) + 146: 6(float) Load 87(g) + 147: 6(float) Load 106(h) + 148: 6(float) Load 107(i) + 149: 7(fvec4) CompositeConstruct 145 146 147 148 + Store 144(gl_FragColor) 149 Return FunctionEnd diff --git a/Test/baseResults/spv.for-complex-condition.vert.out b/Test/baseResults/spv.for-complex-condition.vert.out index bb3bc2a1..939d0827 100644 --- a/Test/baseResults/spv.for-complex-condition.vert.out +++ b/Test/baseResults/spv.for-complex-condition.vert.out @@ -3,38 +3,37 @@ Warning, version 450 is not yet complete; most version-specific features are pre // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 35 +// Id's are bound by 31 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Vertex 4 "main" 18 31 + EntryPoint Vertex 4 "main" 17 27 Source GLSL 450 Name 4 "main" Name 8 "i" - Name 18 "flag" - Name 31 "r" - Decorate 18(flag) RelaxedPrecision - Decorate 18(flag) Location 0 - Decorate 19 RelaxedPrecision - Decorate 31(r) Location 0 + Name 17 "flag" + Name 27 "r" + Decorate 17(flag) RelaxedPrecision + Decorate 17(flag) Location 0 + Decorate 18 RelaxedPrecision + Decorate 27(r) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeInt 32 1 7: TypePointer Function 6(int) 9: 6(int) Constant 0 - 17: TypePointer Input 6(int) - 18(flag): 17(ptr) Variable Input - 20: 6(int) Constant 1 - 21: TypeBool - 25: 6(int) Constant 10 - 27: 6(int) Constant 15 - 30: TypePointer Output 6(int) - 31(r): 30(ptr) Variable Output + 16: TypePointer Input 6(int) + 17(flag): 16(ptr) Variable Input + 19: 6(int) Constant 1 + 20: TypeBool + 22: 6(int) Constant 10 + 23: 6(int) Constant 15 + 26: TypePointer Output 6(int) + 27(r): 26(ptr) Variable Output 4(main): 2 Function None 3 5: Label 8(i): 7(ptr) Variable Function - 16: 7(ptr) Variable Function Store 8(i) 9 Branch 10 10: Label @@ -42,29 +41,20 @@ Warning, version 450 is not yet complete; most version-specific features are pre Branch 14 14: Label 15: 6(int) Load 8(i) - 19: 6(int) Load 18(flag) - 22: 21(bool) IEqual 19 20 - SelectionMerge 24 None - BranchConditional 22 23 26 - 23: Label - Store 16 25 - Branch 24 - 26: Label - Store 16 27 - Branch 24 - 24: Label - 28: 6(int) Load 16 - 29: 21(bool) SLessThan 15 28 - BranchConditional 29 11 12 - 11: Label - 32: 6(int) Load 8(i) - Store 31(r) 32 - Branch 13 - 13: Label - 33: 6(int) Load 8(i) - 34: 6(int) IAdd 33 20 - Store 8(i) 34 - Branch 10 + 18: 6(int) Load 17(flag) + 21: 20(bool) IEqual 18 19 + 24: 6(int) Select 21 22 23 + 25: 20(bool) SLessThan 15 24 + BranchConditional 25 11 12 + 11: Label + 28: 6(int) Load 8(i) + Store 27(r) 28 + Branch 13 + 13: Label + 29: 6(int) Load 8(i) + 30: 6(int) IAdd 29 19 + Store 8(i) 30 + Branch 10 12: Label Return FunctionEnd diff --git a/Test/baseResults/spv.image.frag.out b/Test/baseResults/spv.image.frag.out index 2dd7d4b3..ee29baf2 100644 --- a/Test/baseResults/spv.image.frag.out +++ b/Test/baseResults/spv.image.frag.out @@ -3,7 +3,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 378 +// Id's are bound by 374 Capability Shader Capability SampledRect @@ -16,7 +16,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre Capability StorageImageWriteWithoutFormat 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 132 142 152 248 362 377 + EntryPoint Fragment 4 "main" 132 142 152 248 362 373 ExecutionMode 4 OriginUpperLeft Source GLSL 450 Name 4 "main" @@ -42,7 +42,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre Name 248 "value" Name 357 "wo2D" Name 362 "fragData" - Name 377 "ic4D" + Name 373 "ic4D" Decorate 15(i1D) DescriptorSet 0 Decorate 15(i1D) Binding 0 Decorate 27(i2D) DescriptorSet 0 @@ -76,7 +76,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre Decorate 357(wo2D) DescriptorSet 0 Decorate 357(wo2D) Binding 1 Decorate 357(wo2D) NonReadable - Decorate 377(ic4D) Flat + Decorate 373(ic4D) Flat 2: TypeVoid 3: TypeFunction 2 6: TypeInt 32 1 @@ -163,16 +163,15 @@ Warning, version 450 is not yet complete; most version-specific features are pre 357(wo2D): 356(ptr) Variable UniformConstant 361: TypePointer Output 125(fvec4) 362(fragData): 361(ptr) Variable Output - 368: TypeBool - 375: TypeVector 6(int) 4 - 376: TypePointer Input 375(ivec4) - 377(ic4D): 376(ptr) Variable Input + 367: TypeBool + 371: TypeVector 6(int) 4 + 372: TypePointer Input 371(ivec4) + 373(ic4D): 372(ptr) Variable Input 4(main): 2 Function None 3 5: Label 9(iv): 8(ptr) Variable Function 127(v): 126(ptr) Variable Function 229(ui): 228(ptr) Variable Function - 363: 126(ptr) Variable Function Store 9(iv) 11 16: 13 Load 15(i1D) 17: 6(int) ImageQuerySize 16 @@ -498,22 +497,13 @@ Warning, version 450 is not yet complete; most version-specific features are pre 359: 29(ivec2) Load 142(ic2D) 360: 125(fvec4) Load 127(v) ImageWrite 358 359 360 - 364: 18(int) Load 229(ui) - 365: 20(ptr) AccessChain 9(iv) 237 - 366: 6(int) Load 365 - 367: 18(int) Bitcast 366 - 369: 368(bool) INotEqual 364 367 - SelectionMerge 371 None - BranchConditional 369 370 373 - 370: Label - 372: 125(fvec4) Load 127(v) - Store 363 372 - Branch 371 - 373: Label - Store 363 129 - Branch 371 - 371: Label - 374: 125(fvec4) Load 363 - Store 362(fragData) 374 + 363: 18(int) Load 229(ui) + 364: 20(ptr) AccessChain 9(iv) 237 + 365: 6(int) Load 364 + 366: 18(int) Bitcast 365 + 368: 367(bool) INotEqual 363 366 + 369: 125(fvec4) Load 127(v) + 370: 125(fvec4) Select 368 369 129 + Store 362(fragData) 370 Return FunctionEnd