Allow LocalVariable to be assigned more than once (#2288)

* Allow `LocalVariable` to be assigned more than once

This allows us to write flow controls like loops and if-elses with
LocalVariables participating in phi nodes.

* Add `GetLocalNumber` to operand
This commit is contained in:
FICTURE7 2021-05-17 03:54:53 +04:00 committed by GitHub
parent 212e472c9f
commit c805542b29
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 47 additions and 16 deletions

View file

@ -83,9 +83,10 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
int intFreeRegisters = regMasks.IntAvailableRegisters;
int vecFreeRegisters = regMasks.VecAvailableRegisters;
BlockInfo[] blockInfo = new BlockInfo[cfg.Blocks.Count];
var blockInfo = new BlockInfo[cfg.Blocks.Count];
List<LocalInfo> locInfo = new List<LocalInfo>();
var locInfo = new List<LocalInfo>();
var locVisited = new HashSet<Operand>();
for (int index = cfg.PostOrderBlocks.Length - 1; index >= 0; index--)
{
@ -109,7 +110,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
if (source.Kind == OperandKind.LocalVariable)
{
locInfo[source.AsInt32() - 1].SetBlockIndex(block.Index);
locInfo[source.GetLocalNumber() - 1].SetBlockIndex(block.Index);
}
else if (source.Kind == OperandKind.Memory)
{
@ -117,12 +118,12 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
if (memOp.BaseAddress != null)
{
locInfo[memOp.BaseAddress.AsInt32() - 1].SetBlockIndex(block.Index);
locInfo[memOp.BaseAddress.GetLocalNumber() - 1].SetBlockIndex(block.Index);
}
if (memOp.Index != null)
{
locInfo[memOp.Index.AsInt32() - 1].SetBlockIndex(block.Index);
locInfo[memOp.Index.GetLocalNumber() - 1].SetBlockIndex(block.Index);
}
}
}
@ -135,9 +136,9 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
{
LocalInfo info;
if (dest.Value != 0)
if (!locVisited.Add(dest))
{
info = locInfo[dest.AsInt32() - 1];
info = locInfo[dest.GetLocalNumber() - 1];
}
else
{
@ -198,7 +199,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
void AllocateRegister(Operand source, MemoryOperand memOp, int srcIndex)
{
LocalInfo info = locInfo[source.AsInt32() - 1];
LocalInfo info = locInfo[source.GetLocalNumber() - 1];
info.UseCount++;
@ -317,7 +318,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
continue;
}
LocalInfo info = locInfo[dest.AsInt32() - 1];
LocalInfo info = locInfo[dest.GetLocalNumber() - 1];
if (info.UseCount == 0 && !info.PreAllocated)
{

View file

@ -976,7 +976,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
{
if (operand.Kind == OperandKind.LocalVariable)
{
return operand.AsInt32();
return operand.GetLocalNumber();
}
else if (operand.Kind == OperandKind.Register)
{