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/Compiler.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/Compiler.cs')
| -rw-r--r-- | ARMeilleure/Translation/Compiler.cs | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/ARMeilleure/Translation/Compiler.cs b/ARMeilleure/Translation/Compiler.cs index 9e4cdb24..817bd487 100644 --- a/ARMeilleure/Translation/Compiler.cs +++ b/ARMeilleure/Translation/Compiler.cs @@ -1,4 +1,5 @@ using ARMeilleure.CodeGen; +using ARMeilleure.CodeGen.Optimizations; using ARMeilleure.CodeGen.X86; using ARMeilleure.Diagnostics; using ARMeilleure.IntermediateRepresentation; @@ -13,30 +14,40 @@ namespace ARMeilleure.Translation OperandType retType, CompilerOptions options) { - Logger.StartPass(PassName.Dominance); + CompilerContext cctx = new(cfg, argTypes, retType, options); + + if (options.HasFlag(CompilerOptions.Optimize)) + { + Logger.StartPass(PassName.TailMerge); + + TailMerge.RunPass(cctx); - if ((options & CompilerOptions.SsaForm) != 0) + Logger.EndPass(PassName.TailMerge, cfg); + } + + if (options.HasFlag(CompilerOptions.SsaForm)) { + Logger.StartPass(PassName.Dominance); + Dominance.FindDominators(cfg); Dominance.FindDominanceFrontiers(cfg); - } - Logger.EndPass(PassName.Dominance); + Logger.EndPass(PassName.Dominance); - Logger.StartPass(PassName.SsaConstruction); + Logger.StartPass(PassName.SsaConstruction); - if ((options & CompilerOptions.SsaForm) != 0) - { Ssa.Construct(cfg); + + Logger.EndPass(PassName.SsaConstruction, cfg); } else { - RegisterToLocal.Rename(cfg); - } + Logger.StartPass(PassName.RegisterToLocal); - Logger.EndPass(PassName.SsaConstruction, cfg); + RegisterToLocal.Rename(cfg); - CompilerContext cctx = new(cfg, argTypes, retType, options); + Logger.EndPass(PassName.RegisterToLocal, cfg); + } return CodeGenerator.Generate(cctx); } |
