From c3c3914ed3f9508bd1acca301dbbc75babaef279 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Wed, 9 Feb 2022 17:42:47 -0300 Subject: [PATCH] Add a limit on the number of uses a constant may have (#3097) --- ARMeilleure/CodeGen/X86/X86Optimizer.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ARMeilleure/CodeGen/X86/X86Optimizer.cs b/ARMeilleure/CodeGen/X86/X86Optimizer.cs index ed040e15..98a19b9a 100644 --- a/ARMeilleure/CodeGen/X86/X86Optimizer.cs +++ b/ARMeilleure/CodeGen/X86/X86Optimizer.cs @@ -9,13 +9,17 @@ namespace ARMeilleure.CodeGen.X86 { static class X86Optimizer { + private const int MaxConstantUses = 10000; + public static void RunPass(ControlFlowGraph cfg) { var constants = new Dictionary(); Operand GetConstantCopy(BasicBlock block, Operation operation, Operand source) { - if (!constants.TryGetValue(source.Value, out var constant)) + // If the constant has many uses, we also force a new constant mov to be added, in order + // to avoid overflow of the counts field (that is limited to 16 bits). + if (!constants.TryGetValue(source.Value, out var constant) || constant.UsesCount > MaxConstantUses) { constant = Local(source.Type); @@ -23,7 +27,7 @@ namespace ARMeilleure.CodeGen.X86 block.Operations.AddBefore(operation, copyOp); - constants.Add(source.Value, constant); + constants[source.Value] = constant; } return constant;