Relax block ordering constraints (#1535)

* Relax block ordering constraints

Before `block.Next` had to follow `block.ListNext`, now it does not.
Instead `CodeGenerator` will now emit the necessary jump instructions
to ensure control flow.

This makes control flow and block order modifications easier. It also
eliminates some simple cases of redundant branches.

* Set PPTC version
This commit is contained in:
FICTURE7 2020-09-12 19:32:53 +04:00 committed by GitHub
parent 3d055da5fc
commit 36ec1bc6c0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 164 additions and 174 deletions

View file

@ -626,16 +626,11 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
continue;
}
bool hasSingleOrNoSuccessor = block.Next == null || block.Branch == null;
bool hasSingleOrNoSuccessor = block.SuccessorCount <= 1;
for (int i = 0; i < 2; i++)
for (int i = 0; i < block.SuccessorCount; i++)
{
// This used to use an enumerable, but it ended up generating a lot of garbage, so now it is a loop.
BasicBlock successor = (i == 0) ? block.Next : block.Branch;
if (successor == null)
{
continue;
}
BasicBlock successor = block.GetSuccessor(i);
int succIndex = successor.Index;
@ -643,7 +638,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
// (the successor before the split) should be right after it.
if (IsSplitEdgeBlock(successor))
{
succIndex = FirstSuccessor(successor).Index;
succIndex = successor.GetSuccessor(0).Index;
}
CopyResolver copyResolver = new CopyResolver();
@ -883,10 +878,11 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
BitMap liveOut = blkLiveOut[block.Index];
if ((block.Next != null && liveOut.Set(blkLiveIn[block.Next.Index])) ||
(block.Branch != null && liveOut.Set(blkLiveIn[block.Branch.Index])))
for (int i = 0; i < block.SuccessorCount; i++)
{
modified = true;
BasicBlock succ = block.GetSuccessor(i);
modified |= liveOut.Set(blkLiveIn[succ.Index]);
}
BitMap liveIn = blkLiveIn[block.Index];
@ -1002,11 +998,6 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
return (register.Index << 1) | (register.Type == RegisterType.Vector ? 1 : 0);
}
private static BasicBlock FirstSuccessor(BasicBlock block)
{
return block.Next ?? block.Branch;
}
private static IEnumerable<Node> BottomOperations(BasicBlock block)
{
Node node = block.Operations.Last;