Add an early TailMerge
pass (#2721)
* Add an early `TailMerge` pass Some translations can have a lot of guest calls and since for each guest call there is a call guard which may return. This can produce a lot of epilogue code for returns. This pass merges the epilogue into a single block. ``` Using filter 'hcq'. Using metric 'code size'. Total diff: -1648111 (-7.19 %) (bytes): Base: 22913847 Diff: 21265736 Improved: 4567, regressed: 14, unchanged: 144 ``` * Set PTC version * Address feedback * Handle `void` returning functions * Actually handle `void` returning functions * Fix `RegisterToLocal` logging
This commit is contained in:
parent
d512ce122c
commit
fbf40424f4
7 changed files with 148 additions and 26 deletions
|
@ -10,7 +10,7 @@ namespace ARMeilleure.Translation
|
|||
private BasicBlock[] _postOrderBlocks;
|
||||
private int[] _postOrderMap;
|
||||
|
||||
public int LocalsCount { get; }
|
||||
public int LocalsCount { get; private set; }
|
||||
public BasicBlock Entry { get; }
|
||||
public IntrusiveList<BasicBlock> Blocks { get; }
|
||||
public BasicBlock[] PostOrderBlocks => _postOrderBlocks;
|
||||
|
@ -25,6 +25,15 @@ namespace ARMeilleure.Translation
|
|||
Update();
|
||||
}
|
||||
|
||||
public Operand AllocateLocal(OperandType type)
|
||||
{
|
||||
Operand result = Operand.Factory.Local(type);
|
||||
|
||||
result.NumberLocal(++LocalsCount);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void Update()
|
||||
{
|
||||
RemoveUnreachableBlocks(Blocks);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue