Add a limit on the number of uses a constant may have (#3097)

This commit is contained in:
gdkchan 2022-02-09 17:42:47 -03:00 committed by GitHub
parent 6dffe0fad4
commit c3c3914ed3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -9,13 +9,17 @@ namespace ARMeilleure.CodeGen.X86
{ {
static class X86Optimizer static class X86Optimizer
{ {
private const int MaxConstantUses = 10000;
public static void RunPass(ControlFlowGraph cfg) public static void RunPass(ControlFlowGraph cfg)
{ {
var constants = new Dictionary<ulong, Operand>(); var constants = new Dictionary<ulong, Operand>();
Operand GetConstantCopy(BasicBlock block, Operation operation, Operand source) 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); constant = Local(source.Type);
@ -23,7 +27,7 @@ namespace ARMeilleure.CodeGen.X86
block.Operations.AddBefore(operation, copyOp); block.Operations.AddBefore(operation, copyOp);
constants.Add(source.Value, constant); constants[source.Value] = constant;
} }
return constant; return constant;