Implement block placement (#1549)

* Implement block placement

Implement a simple pass which re-orders cold blocks at the end of the
list of blocks in the CFG.

* Set PPTC version

* Use Array.Resize

Address gdkchan's feedback
This commit is contained in:
FICTURE7 2020-09-20 03:00:24 +04:00 committed by GitHub
parent 1eea35554c
commit f60033e0aa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 136 additions and 31 deletions

View file

@ -0,0 +1,66 @@
using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.Translation;
using System.Diagnostics;
using static ARMeilleure.IntermediateRepresentation.OperandHelper;
namespace ARMeilleure.CodeGen.Optimizations
{
static class BlockPlacement
{
public static void RunPass(ControlFlowGraph cfg)
{
bool update = false;
BasicBlock block;
BasicBlock nextBlock;
BasicBlock lastBlock = cfg.Blocks.Last;
// Move cold blocks at the end of the list, so that they are emitted away from hot code.
for (block = cfg.Blocks.First; block != lastBlock; block = nextBlock)
{
nextBlock = block.ListNext;
if (block.Frequency == BasicBlockFrequency.Cold)
{
cfg.Blocks.Remove(block);
cfg.Blocks.AddLast(block);
}
}
for (block = cfg.Blocks.First; block != null; block = nextBlock)
{
nextBlock = block.ListNext;
if (block.SuccessorCount == 2 && block.Operations.Last is Operation branchOp)
{
Debug.Assert(branchOp.Instruction == Instruction.BranchIf);
BasicBlock falseSucc = block.GetSuccessor(0);
BasicBlock trueSucc = block.GetSuccessor(1);
// If true successor is next block in list, invert the condition. We avoid extra branching by
// making the true side the fallthrough (i.e, convert it to the false side).
if (trueSucc == block.ListNext)
{
Comparison comp = (Comparison)branchOp.GetSource(2).AsInt32();
Comparison compInv = comp.Invert();
branchOp.SetSource(2, Const((int)compInv));
block.SetSuccessor(0, trueSucc);
block.SetSuccessor(1, falseSucc);
update = true;
}
}
}
if (update)
{
cfg.Update(removeUnreachableBlocks: false);
}
}
}
}