Fix C++ portability, non-deterministic order of argument evaluation.
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 31f7aab..10c2f92 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -2590,20 +2590,25 @@
if (builder.isScalarType(nominalTypeId)) {
// Conversion for bool
spv::Id boolType = builder.makeBoolType();
- if (nominalTypeId != boolType)
- rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue, builder.makeUintConstant(1),
- builder.makeUintConstant(0));
- else if (builder.getTypeId(rvalue) != boolType)
+ if (nominalTypeId != boolType) {
+ // keep these outside arguments, for determinant order-of-evaluation
+ spv::Id one = builder.makeUintConstant(1);
+ spv::Id zero = builder.makeUintConstant(0);
+ rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue, one, zero);
+ } else if (builder.getTypeId(rvalue) != boolType)
rvalue = builder.createBinOp(spv::OpINotEqual, boolType, rvalue, builder.makeUintConstant(0));
} else if (builder.isVectorType(nominalTypeId)) {
// Conversion for bvec
int vecSize = builder.getNumTypeComponents(nominalTypeId);
spv::Id bvecType = builder.makeVectorType(builder.makeBoolType(), vecSize);
- if (nominalTypeId != bvecType)
+ if (nominalTypeId != bvecType) {
+ // keep these outside arguments, for determinant order-of-evaluation
+ spv::Id one = builder.makeUintConstant(1);
+ spv::Id zero = builder.makeUintConstant(0);
rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue,
- makeSmearedConstant(builder.makeUintConstant(1), vecSize),
- makeSmearedConstant(builder.makeUintConstant(0), vecSize));
- else if (builder.getTypeId(rvalue) != bvecType)
+ makeSmearedConstant(one, vecSize),
+ makeSmearedConstant(zero, vecSize));
+ } else if (builder.getTypeId(rvalue) != bvecType)
rvalue = builder.createBinOp(spv::OpINotEqual, bvecType, rvalue,
makeSmearedConstant(builder.makeUintConstant(0), vecSize));
}
diff --git a/Test/baseResults/spv.boolInBlock.frag.out b/Test/baseResults/spv.boolInBlock.frag.out
index 4742dad..30490fe 100644
--- a/Test/baseResults/spv.boolInBlock.frag.out
+++ b/Test/baseResults/spv.boolInBlock.frag.out
@@ -52,17 +52,17 @@
28: 27(int) Constant 0
29: 6(bool) ConstantFalse
30: 9(bvec2) ConstantComposite 29 29
- 31: 22(int) Constant 0
- 32: 22(int) Constant 1
- 33: 23(ivec2) ConstantComposite 31 31
- 34: 23(ivec2) ConstantComposite 32 32
+ 31: 22(int) Constant 1
+ 32: 22(int) Constant 0
+ 33: 23(ivec2) ConstantComposite 32 32
+ 34: 23(ivec2) ConstantComposite 31 31
36: TypePointer Uniform 23(ivec2)
38: TypeVector 22(int) 4
39(Uniform): TypeStruct 38(ivec4)
40: TypePointer Uniform 39(Uniform)
41: 40(ptr) Variable Uniform
42: TypePointer Uniform 38(ivec4)
- 65: 38(ivec4) ConstantComposite 31 31 31 31
+ 65: 38(ivec4) ConstantComposite 32 32 32 32
72: TypeFloat 32
73: TypeVector 72(float) 4
74: TypePointer Output 73(fvec4)
@@ -79,14 +79,14 @@
43: 42(ptr) AccessChain 41 28
44: 38(ivec4) Load 43
45: 22(int) CompositeExtract 44 2
- 46: 6(bool) INotEqual 45 31
+ 46: 6(bool) INotEqual 45 32
SelectionMerge 48 None
BranchConditional 46 47 48
47: Label
49: 42(ptr) AccessChain 41 28
50: 38(ivec4) Load 49
51: 22(int) CompositeExtract 50 0
- 52: 6(bool) INotEqual 51 31
+ 52: 6(bool) INotEqual 51 32
53: 9(bvec2) CompositeConstruct 52 52
54: 23(ivec2) Select 53 34 33
55: 36(ptr) AccessChain 26 28
@@ -96,7 +96,7 @@
56: 36(ptr) AccessChain 26 28
57: 23(ivec2) Load 56
58: 22(int) CompositeExtract 57 0
- 59: 6(bool) INotEqual 58 31
+ 59: 6(bool) INotEqual 58 32
SelectionMerge 61 None
BranchConditional 59 60 61
60: Label
@@ -114,14 +114,14 @@
76: 42(ptr) AccessChain 41 28
77: 38(ivec4) Load 76
78: 22(int) CompositeExtract 77 0
- 79: 6(bool) INotEqual 78 31
+ 79: 6(bool) INotEqual 78 32
SelectionMerge 81 None
BranchConditional 79 80 81
80: Label
82: 42(ptr) AccessChain 41 28
83: 38(ivec4) Load 82
84: 22(int) CompositeExtract 83 1
- 85: 6(bool) INotEqual 84 31
+ 85: 6(bool) INotEqual 84 32
Branch 81
81: Label
86: 6(bool) Phi 79 61 85 80
@@ -131,7 +131,7 @@
91: 42(ptr) AccessChain 41 28
92: 38(ivec4) Load 91
93: 22(int) CompositeExtract 92 0
- 94: 6(bool) INotEqual 93 31
+ 94: 6(bool) INotEqual 93 32
95: 6(bool) LogicalNot 94
SelectionMerge 97 None
BranchConditional 95 96 97
@@ -139,7 +139,7 @@
98: 42(ptr) AccessChain 41 28
99: 38(ivec4) Load 98
100: 22(int) CompositeExtract 99 1
- 101: 6(bool) INotEqual 100 31
+ 101: 6(bool) INotEqual 100 32
Branch 97
97: Label
102: 6(bool) Phi 94 81 101 96