diff --git a/spirv_glsl.cpp b/spirv_glsl.cpp index d5b2db76..f83f7c6a 100644 --- a/spirv_glsl.cpp +++ b/spirv_glsl.cpp @@ -5285,7 +5285,6 @@ void CompilerGLSL::emit_glsl_op(uint32_t result_type, uint32_t id, uint32_t eop, case GLSLstd450ModfStruct: { - forced_temporaries.insert(id); auto &type = get(result_type); emit_uninitialized_temporary_expression(result_type, id); statement(to_expression(id), ".", to_member_name(type, 0), " = ", "modf(", to_expression(args[0]), ", ", @@ -5425,7 +5424,6 @@ void CompilerGLSL::emit_glsl_op(uint32_t result_type, uint32_t id, uint32_t eop, case GLSLstd450FrexpStruct: { - forced_temporaries.insert(id); auto &type = get(result_type); emit_uninitialized_temporary_expression(result_type, id); statement(to_expression(id), ".", to_member_name(type, 0), " = ", "frexp(", to_expression(args[0]), ", ", @@ -8533,7 +8531,6 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction) uint32_t result_id = ops[1]; uint32_t op0 = ops[2]; uint32_t op1 = ops[3]; - forced_temporaries.insert(result_id); auto &type = get(result_type); emit_uninitialized_temporary_expression(result_type, result_id); const char *op = opcode == OpUMulExtended ? "umulExtended" : "imulExtended"; diff --git a/spirv_msl.cpp b/spirv_msl.cpp index a4f911c3..7b6b0708 100644 --- a/spirv_msl.cpp +++ b/spirv_msl.cpp @@ -4649,10 +4649,8 @@ void CompilerMSL::emit_instruction(const Instruction &instruction) uint32_t result_id = ops[1]; uint32_t op0 = ops[2]; uint32_t op1 = ops[3]; - forced_temporaries.insert(result_id); auto &type = get(result_type); - statement(variable_decl(type, to_name(result_id)), ";"); - set(result_id, to_name(result_id), result_type, true); + emit_uninitialized_temporary_expression(result_type, result_id); auto &res_type = get(type.member_types[1]); if (opcode == OpIAddCarry) @@ -4681,10 +4679,8 @@ void CompilerMSL::emit_instruction(const Instruction &instruction) uint32_t result_id = ops[1]; uint32_t op0 = ops[2]; uint32_t op1 = ops[3]; - forced_temporaries.insert(result_id); auto &type = get(result_type); - statement(variable_decl(type, to_name(result_id)), ";"); - set(result_id, to_name(result_id), result_type, true); + emit_uninitialized_temporary_expression(result_type, result_id); statement(to_expression(result_id), ".", to_member_name(type, 0), " = ", to_enclosed_expression(op0), " * ", to_enclosed_expression(op1), ";"); @@ -4966,8 +4962,6 @@ void CompilerMSL::emit_atomic_func_op(uint32_t result_type, uint32_t result_id, uint32_t mem_order_2, bool has_mem_order_2, uint32_t obj, uint32_t op1, bool op1_is_pointer, bool op1_is_literal, uint32_t op2) { - forced_temporaries.insert(result_id); - string exp = string(op) + "("; auto &type = get_pointee_type(expression_type(obj)); @@ -5006,12 +5000,11 @@ void CompilerMSL::emit_atomic_func_op(uint32_t result_type, uint32_t result_id, // the CAS loop, otherwise it will loop infinitely, with the comparison test always failing. // The function updates the comparitor value from the memory value, so the additional // comparison test evaluates the memory value against the expected value. - statement(variable_decl(type, to_name(result_id)), ";"); + emit_uninitialized_temporary_expression(result_type, result_id); statement("do"); begin_scope(); statement(to_name(result_id), " = ", to_expression(op1), ";"); end_scope_decl(join("while (!", exp, " && ", to_name(result_id), " == ", to_enclosed_expression(op1), ")")); - set(result_id, to_name(result_id), result_type, true); } else {