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