diff options
Diffstat (limited to 'ARMeilleure/Translation')
| -rw-r--r-- | ARMeilleure/Translation/Compiler.cs | 33 | ||||
| -rw-r--r-- | ARMeilleure/Translation/ControlFlowGraph.cs | 11 | ||||
| -rw-r--r-- | ARMeilleure/Translation/PTC/Ptc.cs | 2 | ||||
| -rw-r--r-- | ARMeilleure/Translation/RegisterUsage.cs | 32 |
4 files changed, 55 insertions, 23 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); } 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); diff --git a/ARMeilleure/Translation/PTC/Ptc.cs b/ARMeilleure/Translation/PTC/Ptc.cs index ba5116a3..8e5349e5 100644 --- a/ARMeilleure/Translation/PTC/Ptc.cs +++ b/ARMeilleure/Translation/PTC/Ptc.cs @@ -27,7 +27,7 @@ namespace ARMeilleure.Translation.PTC private const string OuterHeaderMagicString = "PTCohd\0\0"; private const string InnerHeaderMagicString = "PTCihd\0\0"; - private const uint InternalVersion = 2680; //! To be incremented manually for each change to the ARMeilleure project. + private const uint InternalVersion = 2721; //! To be incremented manually for each change to the ARMeilleure project. private const string ActualDir = "0"; private const string BackupDir = "1"; diff --git a/ARMeilleure/Translation/RegisterUsage.cs b/ARMeilleure/Translation/RegisterUsage.cs index 035d4540..775fa3ab 100644 --- a/ARMeilleure/Translation/RegisterUsage.cs +++ b/ARMeilleure/Translation/RegisterUsage.cs @@ -203,12 +203,18 @@ namespace ARMeilleure.Translation // It always needs a context load as it is the first block to run. if (block.Predecessors.Count == 0 || hasContextLoad) { - arg = Local(OperandType.I64); + long vecMask = globalInputs[block.Index].VecMask; + long intMask = globalInputs[block.Index].IntMask; - Operation loadArg = block.Operations.AddFirst(Operation(Instruction.LoadArgument, arg, Const(0))); + if (vecMask != 0 || intMask != 0) + { + arg = Local(OperandType.I64); + + Operation loadArg = block.Operations.AddFirst(Operation(Instruction.LoadArgument, arg, Const(0))); - LoadLocals(block, globalInputs[block.Index].VecMask, RegisterType.Vector, mode, loadArg, arg); - LoadLocals(block, globalInputs[block.Index].IntMask, RegisterType.Integer, mode, loadArg, arg); + LoadLocals(block, vecMask, RegisterType.Vector, mode, loadArg, arg); + LoadLocals(block, intMask, RegisterType.Integer, mode, loadArg, arg); + } } bool hasContextStore = HasContextStore(block); @@ -220,15 +226,21 @@ namespace ARMeilleure.Translation if (EndsWithReturn(block) || hasContextStore) { - if (arg == default) + long vecMask = globalOutputs[block.Index].VecMask; + long intMask = globalOutputs[block.Index].IntMask; + + if (vecMask != 0 || intMask != 0) { - arg = Local(OperandType.I64); + if (arg == default) + { + arg = Local(OperandType.I64); - block.Append(Operation(Instruction.LoadArgument, arg, Const(0))); - } + block.Append(Operation(Instruction.LoadArgument, arg, Const(0))); + } - StoreLocals(block, globalOutputs[block.Index].IntMask, RegisterType.Integer, mode, arg); - StoreLocals(block, globalOutputs[block.Index].VecMask, RegisterType.Vector, mode, arg); + StoreLocals(block, intMask, RegisterType.Integer, mode, arg); + StoreLocals(block, vecMask, RegisterType.Vector, mode, arg); + } } } } |
