diff options
Diffstat (limited to 'src/shader_recompiler/backend')
8 files changed, 20 insertions, 28 deletions
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl.cpp b/src/shader_recompiler/backend/glsl/emit_glsl.cpp index 6d64913bb..9f8cf659f 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl.cpp | |||
| @@ -156,8 +156,7 @@ void EmitCode(EmitContext& ctx, const IR::Program& program) { | |||
| 156 | ctx.Add("for(;;){{"); | 156 | ctx.Add("for(;;){{"); |
| 157 | break; | 157 | break; |
| 158 | case IR::AbstractSyntaxNode::Type::Repeat: | 158 | case IR::AbstractSyntaxNode::Type::Repeat: |
| 159 | ctx.Add("if({}){{continue;}}else{{break;}}}}", | 159 | ctx.Add("if(!{}){{break;}}}}", ctx.var_alloc.Consume(node.data.repeat.cond)); |
| 160 | ctx.var_alloc.Consume(node.data.repeat.cond)); | ||
| 161 | break; | 160 | break; |
| 162 | default: | 161 | default: |
| 163 | throw NotImplementedException("AbstractSyntaxNode Type {}", node.type); | 162 | throw NotImplementedException("AbstractSyntaxNode Type {}", node.type); |
| @@ -166,7 +165,7 @@ void EmitCode(EmitContext& ctx, const IR::Program& program) { | |||
| 166 | } | 165 | } |
| 167 | 166 | ||
| 168 | std::string GlslVersionSpecifier(const EmitContext& ctx) { | 167 | std::string GlslVersionSpecifier(const EmitContext& ctx) { |
| 169 | if (ctx.uses_y_direction || ctx.info.stores_legacy_varyings) { | 168 | if (ctx.uses_y_direction || ctx.info.stores_legacy_varyings || ctx.info.loads_legacy_varyings) { |
| 170 | return " compatibility"; | 169 | return " compatibility"; |
| 171 | } | 170 | } |
| 172 | return ""; | 171 | return ""; |
| @@ -187,7 +186,8 @@ void DefineVariables(const EmitContext& ctx, std::string& header) { | |||
| 187 | const auto type{static_cast<GlslVarType>(i)}; | 186 | const auto type{static_cast<GlslVarType>(i)}; |
| 188 | const auto& tracker{ctx.var_alloc.GetUseTracker(type)}; | 187 | const auto& tracker{ctx.var_alloc.GetUseTracker(type)}; |
| 189 | const auto type_name{ctx.var_alloc.GetGlslType(type)}; | 188 | const auto type_name{ctx.var_alloc.GetGlslType(type)}; |
| 190 | const auto precise{IsPreciseType(type) ? "precise " : ""}; | 189 | const bool has_precise_bug{ctx.stage == Stage::Fragment && ctx.profile.has_gl_precise_bug}; |
| 190 | const auto precise{!has_precise_bug && IsPreciseType(type) ? "precise " : ""}; | ||
| 191 | // Temps/return types that are never used are stored at index 0 | 191 | // Temps/return types that are never used are stored at index 0 |
| 192 | if (tracker.uses_temp) { | 192 | if (tracker.uses_temp) { |
| 193 | header += fmt::format("{}{} t{}={}(0);", precise, type_name, | 193 | header += fmt::format("{}{} t{}={}(0);", precise, type_name, |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp index 9152ace98..772acc5a4 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp | |||
| @@ -98,7 +98,7 @@ void EmitSharedAtomicExchange32(EmitContext& ctx, IR::Inst& inst, std::string_vi | |||
| 98 | 98 | ||
| 99 | void EmitSharedAtomicExchange64(EmitContext& ctx, IR::Inst& inst, std::string_view pointer_offset, | 99 | void EmitSharedAtomicExchange64(EmitContext& ctx, IR::Inst& inst, std::string_view pointer_offset, |
| 100 | std::string_view value) { | 100 | std::string_view value) { |
| 101 | LOG_WARNING(Shader_GLSL, "Int64 Atomics not supported, fallback to non-atomic"); | 101 | LOG_WARNING(Shader_GLSL, "Int64 atomics not supported, fallback to non-atomic"); |
| 102 | ctx.AddU64("{}=packUint2x32(uvec2(smem[{}>>2],smem[({}+4)>>2]));", inst, pointer_offset, | 102 | ctx.AddU64("{}=packUint2x32(uvec2(smem[{}>>2],smem[({}+4)>>2]));", inst, pointer_offset, |
| 103 | pointer_offset); | 103 | pointer_offset); |
| 104 | ctx.Add("smem[{}>>2]=unpackUint2x32({}).x;smem[({}+4)>>2]=unpackUint2x32({}).y;", | 104 | ctx.Add("smem[{}>>2]=unpackUint2x32({}).x;smem[({}+4)>>2]=unpackUint2x32({}).y;", |
| @@ -171,7 +171,7 @@ void EmitStorageAtomicExchange32(EmitContext& ctx, IR::Inst& inst, const IR::Val | |||
| 171 | 171 | ||
| 172 | void EmitStorageAtomicIAdd64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, | 172 | void EmitStorageAtomicIAdd64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
| 173 | const IR::Value& offset, std::string_view value) { | 173 | const IR::Value& offset, std::string_view value) { |
| 174 | LOG_WARNING(Shader_GLSL, "Int64 Atomics not supported, fallback to non-atomic"); | 174 | LOG_WARNING(Shader_GLSL, "Int64 atomics not supported, fallback to non-atomic"); |
| 175 | ctx.AddU64("{}=packUint2x32(uvec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, | 175 | ctx.AddU64("{}=packUint2x32(uvec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, |
| 176 | ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, | 176 | ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, |
| 177 | binding.U32(), ctx.var_alloc.Consume(offset)); | 177 | binding.U32(), ctx.var_alloc.Consume(offset)); |
| @@ -182,7 +182,7 @@ void EmitStorageAtomicIAdd64(EmitContext& ctx, IR::Inst& inst, const IR::Value& | |||
| 182 | 182 | ||
| 183 | void EmitStorageAtomicSMin64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, | 183 | void EmitStorageAtomicSMin64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
| 184 | const IR::Value& offset, std::string_view value) { | 184 | const IR::Value& offset, std::string_view value) { |
| 185 | LOG_WARNING(Shader_GLSL, "Int64 Atomics not supported, fallback to non-atomic"); | 185 | LOG_WARNING(Shader_GLSL, "Int64 atomics not supported, fallback to non-atomic"); |
| 186 | ctx.AddU64("{}=packInt2x32(ivec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, | 186 | ctx.AddU64("{}=packInt2x32(ivec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, |
| 187 | ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, | 187 | ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, |
| 188 | binding.U32(), ctx.var_alloc.Consume(offset)); | 188 | binding.U32(), ctx.var_alloc.Consume(offset)); |
| @@ -195,7 +195,7 @@ void EmitStorageAtomicSMin64(EmitContext& ctx, IR::Inst& inst, const IR::Value& | |||
| 195 | 195 | ||
| 196 | void EmitStorageAtomicUMin64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, | 196 | void EmitStorageAtomicUMin64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
| 197 | const IR::Value& offset, std::string_view value) { | 197 | const IR::Value& offset, std::string_view value) { |
| 198 | LOG_WARNING(Shader_GLSL, "Int64 Atomics not supported, fallback to non-atomic"); | 198 | LOG_WARNING(Shader_GLSL, "Int64 atomics not supported, fallback to non-atomic"); |
| 199 | ctx.AddU64("{}=packUint2x32(uvec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, | 199 | ctx.AddU64("{}=packUint2x32(uvec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, |
| 200 | ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, | 200 | ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, |
| 201 | binding.U32(), ctx.var_alloc.Consume(offset)); | 201 | binding.U32(), ctx.var_alloc.Consume(offset)); |
| @@ -207,7 +207,7 @@ void EmitStorageAtomicUMin64(EmitContext& ctx, IR::Inst& inst, const IR::Value& | |||
| 207 | 207 | ||
| 208 | void EmitStorageAtomicSMax64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, | 208 | void EmitStorageAtomicSMax64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
| 209 | const IR::Value& offset, std::string_view value) { | 209 | const IR::Value& offset, std::string_view value) { |
| 210 | LOG_WARNING(Shader_GLSL, "Int64 Atomics not supported, fallback to non-atomic"); | 210 | LOG_WARNING(Shader_GLSL, "Int64 atomics not supported, fallback to non-atomic"); |
| 211 | ctx.AddU64("{}=packInt2x32(ivec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, | 211 | ctx.AddU64("{}=packInt2x32(ivec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, |
| 212 | ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, | 212 | ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, |
| 213 | binding.U32(), ctx.var_alloc.Consume(offset)); | 213 | binding.U32(), ctx.var_alloc.Consume(offset)); |
| @@ -220,7 +220,7 @@ void EmitStorageAtomicSMax64(EmitContext& ctx, IR::Inst& inst, const IR::Value& | |||
| 220 | 220 | ||
| 221 | void EmitStorageAtomicUMax64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, | 221 | void EmitStorageAtomicUMax64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
| 222 | const IR::Value& offset, std::string_view value) { | 222 | const IR::Value& offset, std::string_view value) { |
| 223 | LOG_WARNING(Shader_GLSL, "Int64 Atomics not supported, fallback to non-atomic"); | 223 | LOG_WARNING(Shader_GLSL, "Int64 atomics not supported, fallback to non-atomic"); |
| 224 | ctx.AddU64("{}=packUint2x32(uvec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, | 224 | ctx.AddU64("{}=packUint2x32(uvec2({}_ssbo{}[{}>>2],{}_ssbo{}[({}>>2)+1]));", inst, |
| 225 | ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, | 225 | ctx.stage_name, binding.U32(), ctx.var_alloc.Consume(offset), ctx.stage_name, |
| 226 | binding.U32(), ctx.var_alloc.Consume(offset)); | 226 | binding.U32(), ctx.var_alloc.Consume(offset)); |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp index 7421ce97d..49a66e3ec 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp | |||
| @@ -17,8 +17,7 @@ void CompositeInsert(EmitContext& ctx, std::string_view result, std::string_view | |||
| 17 | // The result is aliased with the composite | 17 | // The result is aliased with the composite |
| 18 | ctx.Add("{}.{}={};", composite, SWIZZLE[index], object); | 18 | ctx.Add("{}.{}={};", composite, SWIZZLE[index], object); |
| 19 | } else { | 19 | } else { |
| 20 | ctx.Add("{}={};", result, composite); | 20 | ctx.Add("{}={};{}.{}={};", result, composite, result, SWIZZLE[index], object); |
| 21 | ctx.Add("{}.{}={};", result, SWIZZLE[index], object); | ||
| 22 | } | 21 | } |
| 23 | } | 22 | } |
| 24 | } // Anonymous namespace | 23 | } // Anonymous namespace |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index 0d1e5ed7f..edeecc26e 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp | |||
| @@ -30,7 +30,7 @@ std::string InputVertexIndex(EmitContext& ctx, std::string_view vertex) { | |||
| 30 | return IsInputArray(ctx.stage) ? fmt::format("[{}]", vertex) : ""; | 30 | return IsInputArray(ctx.stage) ? fmt::format("[{}]", vertex) : ""; |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | std::string OutputVertexIndex(EmitContext& ctx) { | 33 | std::string_view OutputVertexIndex(EmitContext& ctx) { |
| 34 | return ctx.stage == Stage::TessellationControl ? "[gl_InvocationID]" : ""; | 34 | return ctx.stage == Stage::TessellationControl ? "[gl_InvocationID]" : ""; |
| 35 | } | 35 | } |
| 36 | 36 | ||
| @@ -40,7 +40,7 @@ void GetCbuf(EmitContext& ctx, std::string_view ret, const IR::Value& binding, | |||
| 40 | const bool is_immediate{offset.IsImmediate()}; | 40 | const bool is_immediate{offset.IsImmediate()}; |
| 41 | if (is_immediate) { | 41 | if (is_immediate) { |
| 42 | const s32 signed_offset{static_cast<s32>(offset.U32())}; | 42 | const s32 signed_offset{static_cast<s32>(offset.U32())}; |
| 43 | static constexpr u32 cbuf_size{4096 * 16}; | 43 | static constexpr u32 cbuf_size{0x10000}; |
| 44 | if (signed_offset < 0 || offset.U32() > cbuf_size) { | 44 | if (signed_offset < 0 || offset.U32() > cbuf_size) { |
| 45 | LOG_WARNING(Shader_GLSL, "Immediate constant buffer offset is out of bounds"); | 45 | LOG_WARNING(Shader_GLSL, "Immediate constant buffer offset is out of bounds"); |
| 46 | ctx.Add("{}=0u;", ret); | 46 | ctx.Add("{}=0u;", ret); |
| @@ -140,7 +140,7 @@ void EmitGetCbufU32x2(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding | |||
| 140 | const IR::Value& offset) { | 140 | const IR::Value& offset) { |
| 141 | const auto cbuf{fmt::format("{}_cbuf{}", ctx.stage_name, binding.U32())}; | 141 | const auto cbuf{fmt::format("{}_cbuf{}", ctx.stage_name, binding.U32())}; |
| 142 | if (offset.IsImmediate()) { | 142 | if (offset.IsImmediate()) { |
| 143 | static constexpr u32 cbuf_size{4096 * 16}; | 143 | static constexpr u32 cbuf_size{0x10000}; |
| 144 | const u32 u32_offset{offset.U32()}; | 144 | const u32 u32_offset{offset.U32()}; |
| 145 | const s32 signed_offset{static_cast<s32>(offset.U32())}; | 145 | const s32 signed_offset{static_cast<s32>(offset.U32())}; |
| 146 | if (signed_offset < 0 || u32_offset > cbuf_size) { | 146 | if (signed_offset < 0 || u32_offset > cbuf_size) { |
| @@ -308,21 +308,13 @@ void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, std::string_view val | |||
| 308 | case IR::Attribute::ColorFrontDiffuseG: | 308 | case IR::Attribute::ColorFrontDiffuseG: |
| 309 | case IR::Attribute::ColorFrontDiffuseB: | 309 | case IR::Attribute::ColorFrontDiffuseB: |
| 310 | case IR::Attribute::ColorFrontDiffuseA: | 310 | case IR::Attribute::ColorFrontDiffuseA: |
| 311 | if (ctx.stage == Stage::Fragment) { | 311 | ctx.Add("gl_FrontColor.{}={};", swizzle, value); |
| 312 | ctx.Add("gl_Color.{}={};", swizzle, value); | ||
| 313 | } else { | ||
| 314 | ctx.Add("gl_FrontColor.{}={};", swizzle, value); | ||
| 315 | } | ||
| 316 | break; | 312 | break; |
| 317 | case IR::Attribute::ColorFrontSpecularR: | 313 | case IR::Attribute::ColorFrontSpecularR: |
| 318 | case IR::Attribute::ColorFrontSpecularG: | 314 | case IR::Attribute::ColorFrontSpecularG: |
| 319 | case IR::Attribute::ColorFrontSpecularB: | 315 | case IR::Attribute::ColorFrontSpecularB: |
| 320 | case IR::Attribute::ColorFrontSpecularA: | 316 | case IR::Attribute::ColorFrontSpecularA: |
| 321 | if (ctx.stage == Stage::Fragment) { | 317 | ctx.Add("gl_FrontSecondaryColor.{}={};", swizzle, value); |
| 322 | ctx.Add("gl_SecondaryColor.{}={};", swizzle, value); | ||
| 323 | } else { | ||
| 324 | ctx.Add("gl_FrontSecondaryColor.{}={};", swizzle, value); | ||
| 325 | } | ||
| 326 | break; | 318 | break; |
| 327 | case IR::Attribute::ColorBackDiffuseR: | 319 | case IR::Attribute::ColorBackDiffuseR: |
| 328 | case IR::Attribute::ColorBackDiffuseG: | 320 | case IR::Attribute::ColorBackDiffuseG: |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp index 7a2f79d10..983e6d95d 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp | |||
| @@ -28,6 +28,7 @@ void SetSignFlag(EmitContext& ctx, IR::Inst& inst, std::string_view result) { | |||
| 28 | sign->Invalidate(); | 28 | sign->Invalidate(); |
| 29 | } | 29 | } |
| 30 | } // Anonymous namespace | 30 | } // Anonymous namespace |
| 31 | |||
| 31 | void EmitIAdd32(EmitContext& ctx, IR::Inst& inst, std::string_view a, std::string_view b) { | 32 | void EmitIAdd32(EmitContext& ctx, IR::Inst& inst, std::string_view a, std::string_view b) { |
| 32 | const auto result{ctx.var_alloc.Define(inst, GlslVarType::U32)}; | 33 | const auto result{ctx.var_alloc.Define(inst, GlslVarType::U32)}; |
| 33 | if (IR::Inst* const carry{inst.GetAssociatedPseudoOperation(IR::Opcode::GetCarryFromOp)}) { | 34 | if (IR::Inst* const carry{inst.GetAssociatedPseudoOperation(IR::Opcode::GetCarryFromOp)}) { |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp index 8a13bf617..518b78f06 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp | |||
| @@ -20,6 +20,7 @@ void SharedWriteCas(EmitContext& ctx, std::string_view offset, std::string_view | |||
| 20 | ctx.Add(cas_loop, smem, smem, smem, value, bit_offset, num_bits); | 20 | ctx.Add(cas_loop, smem, smem, smem, value, bit_offset, num_bits); |
| 21 | } | 21 | } |
| 22 | } // Anonymous namespace | 22 | } // Anonymous namespace |
| 23 | |||
| 23 | void EmitLoadSharedU8(EmitContext& ctx, IR::Inst& inst, std::string_view offset) { | 24 | void EmitLoadSharedU8(EmitContext& ctx, IR::Inst& inst, std::string_view offset) { |
| 24 | ctx.AddU32("{}=bitfieldExtract(smem[{}>>2],int({}%4)*8,8);", inst, offset, offset); | 25 | ctx.AddU32("{}=bitfieldExtract(smem[{}>>2],int({}%4)*8,8);", inst, offset, offset); |
| 25 | } | 26 | } |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp index 7047928fd..4d418cbbc 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp | |||
| @@ -43,7 +43,7 @@ void UseShuffleNv(EmitContext& ctx, IR::Inst& inst, std::string_view shfl_op, | |||
| 43 | ctx.AddU32("{}={}({},{},{},shfl_in_bounds);", inst, shfl_op, value, index, width); | 43 | ctx.AddU32("{}={}({},{},{},shfl_in_bounds);", inst, shfl_op, value, index, width); |
| 44 | SetInBoundsFlag(ctx, inst); | 44 | SetInBoundsFlag(ctx, inst); |
| 45 | } | 45 | } |
| 46 | } // namespace | 46 | } // Anonymous namespace |
| 47 | 47 | ||
| 48 | void EmitLaneId(EmitContext& ctx, IR::Inst& inst) { | 48 | void EmitLaneId(EmitContext& ctx, IR::Inst& inst) { |
| 49 | ctx.AddU32("{}=gl_SubGroupInvocationARB&31u;", inst); | 49 | ctx.AddU32("{}=gl_SubGroupInvocationARB&31u;", inst); |
diff --git a/src/shader_recompiler/backend/glsl/var_alloc.cpp b/src/shader_recompiler/backend/glsl/var_alloc.cpp index cbf56491c..194f926ca 100644 --- a/src/shader_recompiler/backend/glsl/var_alloc.cpp +++ b/src/shader_recompiler/backend/glsl/var_alloc.cpp | |||
| @@ -177,8 +177,7 @@ Id VarAlloc::Alloc(GlslVarType type) { | |||
| 177 | 177 | ||
| 178 | void VarAlloc::Free(Id id) { | 178 | void VarAlloc::Free(Id id) { |
| 179 | if (id.is_valid == 0) { | 179 | if (id.is_valid == 0) { |
| 180 | // throw LogicError("Freeing invalid variable"); | 180 | throw LogicError("Freeing invalid variable"); |
| 181 | return; | ||
| 182 | } | 181 | } |
| 183 | auto& use_tracker{GetUseTracker(id.type)}; | 182 | auto& use_tracker{GetUseTracker(id.type)}; |
| 184 | use_tracker.var_use[id.index] = false; | 183 | use_tracker.var_use[id.index] = false; |