diff options
author | FICTURE7 <FICTURE7@gmail.com> | 2021-10-19 02:51:22 +0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-18 19:51:22 -0300 |
commit | fbf40424f4d3a9aecc7fe528d7503619738ce542 (patch) | |
tree | df9ba920add4d744fe527e78cc040ff4658a6d7e /ARMeilleure/Translation/ControlFlowGraph.cs | |
parent | d512ce122cb1c9a7fe7cb40d3f85d642ee37f897 (diff) |
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
Diffstat (limited to 'ARMeilleure/Translation/ControlFlowGraph.cs')
-rw-r--r-- | ARMeilleure/Translation/ControlFlowGraph.cs | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/ARMeilleure/Translation/ControlFlowGraph.cs b/ARMeilleure/Translation/ControlFlowGraph.cs index 3e7ff0c9..77d2bc46 100644 --- a/ARMeilleure/Translation/ControlFlowGraph.cs +++ b/ARMeilleure/Translation/ControlFlowGraph.cs @@ -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); |