From 312be74861dae16311f4376e32195f8a4fd372c6 Mon Sep 17 00:00:00 2001 From: FICTURE7 Date: Wed, 29 Sep 2021 03:38:37 +0400 Subject: Optimize `HybridAllocator` (#2637) * Store constant `Operand`s in the `LocalInfo` Since the spill slot and register assigned is fixed, we can just store the `Operand` reference in the `LocalInfo` struct. This allows skipping hitting the intern-table for a look up. * Skip `Uses`/`Assignments` management Since the `HybridAllocator` is the last pass and we do not care about uses/assignments we can skip managing that when setting destinations or sources. * Make `GetLocalInfo` inlineable Also fix a possible issue where with numbered locals. See or-assignment operator in `SetVisited(local)` before patch. * Do not run `BlockPlacement` in LCQ With the host mapped memory manager, there is a lot less cold code to split from hot code. So disabling this in LCQ gives some extra throughput - where we need it. * Address Mou-Ikkai's feedback * Apply suggestions from code review Co-authored-by: VocalFan <45863583+Mou-Ikkai@users.noreply.github.com> * Move check to an assert Co-authored-by: VocalFan <45863583+Mou-Ikkai@users.noreply.github.com> --- ARMeilleure/CodeGen/X86/CodeGenerator.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'ARMeilleure/CodeGen/X86/CodeGenerator.cs') diff --git a/ARMeilleure/CodeGen/X86/CodeGenerator.cs b/ARMeilleure/CodeGen/X86/CodeGenerator.cs index 924c113c..ba2df802 100644 --- a/ARMeilleure/CodeGen/X86/CodeGenerator.cs +++ b/ARMeilleure/CodeGen/X86/CodeGenerator.cs @@ -97,16 +97,18 @@ namespace ARMeilleure.CodeGen.X86 Logger.StartPass(PassName.Optimization); - if ((cctx.Options & CompilerOptions.SsaForm) != 0 && - (cctx.Options & CompilerOptions.Optimize) != 0) + if (cctx.Options.HasFlag(CompilerOptions.Optimize)) { - Optimizer.RunPass(cfg); + if (cctx.Options.HasFlag(CompilerOptions.SsaForm)) + { + Optimizer.RunPass(cfg); + } + + BlockPlacement.RunPass(cfg); } X86Optimizer.RunPass(cfg); - BlockPlacement.RunPass(cfg); - Logger.EndPass(PassName.Optimization, cfg); Logger.StartPass(PassName.PreAllocation); @@ -119,14 +121,14 @@ namespace ARMeilleure.CodeGen.X86 Logger.StartPass(PassName.RegisterAllocation); - if ((cctx.Options & CompilerOptions.SsaForm) != 0) + if (cctx.Options.HasFlag(CompilerOptions.SsaForm)) { Ssa.Deconstruct(cfg); } IRegisterAllocator regAlloc; - if ((cctx.Options & CompilerOptions.Lsra) != 0) + if (cctx.Options.HasFlag(CompilerOptions.Lsra)) { regAlloc = new LinearScanAllocator(); } -- cgit v1.2.3