diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp index 3e2768b66b3d6f1d7ee929c12c5c9faa1df9c940..9d8288a2c2ddd6b70bb061ef668f012235765e1b 100755 --- a/SPIRV/SpvBuilder.cpp +++ b/SPIRV/SpvBuilder.cpp @@ -2304,9 +2304,18 @@ Builder::Loop::Loop(Builder& builder, bool testFirstArg) merge(new Block(builder.getUniqueId(), *function)), body(new Block(builder.getUniqueId(), *function)), testFirst(testFirstArg), - isFirstIteration(testFirst - ? nullptr - : new Instruction(builder.getUniqueId(), builder.makeBoolType(), OpPhi)) - {} + isFirstIteration(nullptr) +{ + if (!testFirst) + { +// You may be tempted to rewrite this as +// new Instruction(builder.getUniqueId(), builder.makeBoolType(), OpPhi); +// This will cause subtle test failures because builder.getUniqueId(), +// and builder.makeBoolType() can then get run in a compiler-specific +// order making tests fail for certain configurations. + Id instructionId = builder.getUniqueId(); + isFirstIteration = new Instruction(instructionId, builder.makeBoolType(), OpPhi); + } +} }; // end spv namespace diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h index c5637f0425804442c0f3757b2215ddaf017992ee..23b9bc2c081def8f02f4647b046ccc309c0e90cb 100755 --- a/SPIRV/SpvBuilder.h +++ b/SPIRV/SpvBuilder.h @@ -564,8 +564,9 @@ protected: const bool testFirst; // When the test executes after the body, this is defined as the phi // instruction that tells us whether we are on the first iteration of - // the loop. Otherwise this is null. - Instruction* const isFirstIteration; + // the loop. Otherwise this is null. This is non-const because + // it has to be initialized outside of the initializer-list. + Instruction* isFirstIteration; }; // Our loop stack.