SPV: Emit OpSelect when a selection node is simple enough.
Also, ensures it has a type, no disallowed side effects,
or performance trade offs.
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index b15a19f..bf26cdc 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -1748,42 +1748,94 @@
}
}
+// 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 f8e75eb..d8ec8cf 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 @@
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 f84687a..2810ff1 100644
--- a/Test/baseResults/spv.bool.vert.out
+++ b/Test/baseResults/spv.bool.vert.out
@@ -3,7 +3,7 @@
// 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 @@
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 @@
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 29cf848..b6613ef 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 @@
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 @@
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 @@
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 @@
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 bb3bc2a..939d082 100644
--- a/Test/baseResults/spv.for-complex-condition.vert.out
+++ b/Test/baseResults/spv.for-complex-condition.vert.out
@@ -3,38 +3,37 @@
// 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 @@
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 2dd7d4b..ee29baf 100644
--- a/Test/baseResults/spv.image.frag.out
+++ b/Test/baseResults/spv.image.frag.out
@@ -3,7 +3,7 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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