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:
parent
212e472c9f
commit
c805542b29
6 changed files with 47 additions and 16 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue