diff options
author | gdkchan <gab.dark.100@gmail.com> | 2023-03-08 19:25:35 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-08 23:25:35 +0100 |
commit | f0562b9c75308c8cfcaa2458dfd37ac42751a374 (patch) | |
tree | bdcd7c9af2ad687c7cb4f4f519ff5a6a1b6a2092 /ARMeilleure/CodeGen/Arm64/PreAllocator.cs | |
parent | b8556530f2b160db70ff571adf25ae26d4b8f58f (diff) |
CPU: Avoid argument value copies on the JIT (#4484)1.1.651
* Minor refactoring of the pre-allocator
* Avoid LoadArgument copies
* PPTC version bump
Diffstat (limited to 'ARMeilleure/CodeGen/Arm64/PreAllocator.cs')
-rw-r--r-- | ARMeilleure/CodeGen/Arm64/PreAllocator.cs | 86 |
1 files changed, 19 insertions, 67 deletions
diff --git a/ARMeilleure/CodeGen/Arm64/PreAllocator.cs b/ARMeilleure/CodeGen/Arm64/PreAllocator.cs index a7f07394..6ea9d239 100644 --- a/ARMeilleure/CodeGen/Arm64/PreAllocator.cs +++ b/ARMeilleure/CodeGen/Arm64/PreAllocator.cs @@ -9,7 +9,7 @@ using static ARMeilleure.IntermediateRepresentation.Operation.Factory; namespace ARMeilleure.CodeGen.Arm64 { - class PreAllocator + static class PreAllocator { private class ConstantDict { @@ -54,8 +54,8 @@ namespace ARMeilleure.CodeGen.Arm64 continue; } - HandleConstantRegCopy(constants, block.Operations, node); - HandleDestructiveRegCopy(block.Operations, node); + InsertConstantRegCopies(constants, block.Operations, node); + InsertDestructiveRegCopies(block.Operations, node); switch (node.Instruction) { @@ -78,28 +78,28 @@ namespace ARMeilleure.CodeGen.Arm64 // Copy values to registers expected by the function // being called, as mandated by the ABI. - HandleCall(constants, block.Operations, node); + InsertCallCopies(constants, block.Operations, node); break; case Instruction.CompareAndSwap: case Instruction.CompareAndSwap16: case Instruction.CompareAndSwap8: - nextNode = HandleCompareAndSwap(block.Operations, node); + nextNode = GenerateCompareAndSwap(block.Operations, node); break; case Instruction.LoadArgument: - nextNode = HandleLoadArgument(cctx, ref buffer, block.Operations, preservedArgs, node); + nextNode = InsertLoadArgumentCopy(cctx, ref buffer, block.Operations, preservedArgs, node); break; case Instruction.Return: - HandleReturn(block.Operations, node); + InsertReturnCopy(block.Operations, node); break; case Instruction.Tailcall: - HandleTailcall(constants, block.Operations, stackAlloc, node, node); + InsertTailcallCopies(constants, block.Operations, stackAlloc, node, node); break; } } } } - private static void HandleConstantRegCopy(ConstantDict constants, IntrusiveList<Operation> nodes, Operation node) + private static void InsertConstantRegCopies(ConstantDict constants, IntrusiveList<Operation> nodes, Operation node) { if (node.SourcesCount == 0 || IsIntrinsicWithConst(node)) { @@ -211,7 +211,7 @@ namespace ARMeilleure.CodeGen.Arm64 } } - private static void HandleDestructiveRegCopy(IntrusiveList<Operation> nodes, Operation node) + private static void InsertDestructiveRegCopies(IntrusiveList<Operation> nodes, Operation node) { if (node.Destination == default || node.SourcesCount == 0) { @@ -259,7 +259,7 @@ namespace ARMeilleure.CodeGen.Arm64 } } - private static void HandleCall(ConstantDict constants, IntrusiveList<Operation> nodes, Operation node) + private static void InsertCallCopies(ConstantDict constants, IntrusiveList<Operation> nodes, Operation node) { Operation operation = node; @@ -319,7 +319,7 @@ namespace ARMeilleure.CodeGen.Arm64 Operation copyOp = Operation(Instruction.Copy, argReg, source); - HandleConstantRegCopy(constants, nodes, nodes.AddBefore(node, copyOp)); + InsertConstantRegCopies(constants, nodes, nodes.AddBefore(node, copyOp)); sources.Add(argReg); } @@ -329,7 +329,7 @@ namespace ARMeilleure.CodeGen.Arm64 Operation spillOp = Operation(Instruction.SpillArg, default, offset, source); - HandleConstantRegCopy(constants, nodes, nodes.AddBefore(node, spillOp)); + InsertConstantRegCopies(constants, nodes, nodes.AddBefore(node, spillOp)); stackOffset += source.Type.GetSizeInBytes(); } @@ -364,7 +364,7 @@ namespace ARMeilleure.CodeGen.Arm64 operation.SetSources(sources.ToArray()); } - private static void HandleTailcall( + private static void InsertTailcallCopies( ConstantDict constants, IntrusiveList<Operation> nodes, StackAllocator stackAlloc, @@ -420,7 +420,7 @@ namespace ARMeilleure.CodeGen.Arm64 Operation copyOp = Operation(Instruction.Copy, argReg, source); - HandleConstantRegCopy(constants, nodes, nodes.AddBefore(node, copyOp)); + InsertConstantRegCopies(constants, nodes, nodes.AddBefore(node, copyOp)); sources.Add(argReg); } @@ -444,7 +444,7 @@ namespace ARMeilleure.CodeGen.Arm64 operation.SetSources(sources.ToArray()); } - private static Operation HandleCompareAndSwap(IntrusiveList<Operation> nodes, Operation node) + private static Operation GenerateCompareAndSwap(IntrusiveList<Operation> nodes, Operation node) { Operand expected = node.GetSource(1); @@ -508,7 +508,7 @@ namespace ARMeilleure.CodeGen.Arm64 return node.ListNext; } - private static void HandleReturn(IntrusiveList<Operation> nodes, Operation node) + private static void InsertReturnCopy(IntrusiveList<Operation> nodes, Operation node) { if (node.SourcesCount == 0) { @@ -537,7 +537,7 @@ namespace ARMeilleure.CodeGen.Arm64 } } - private static Operation HandleLoadArgument( + private static Operation InsertLoadArgumentCopy( CompilerContext cctx, ref Span<Operation> buffer, IntrusiveList<Operation> nodes, @@ -629,7 +629,7 @@ namespace ARMeilleure.CodeGen.Arm64 if (dest.AssignmentsCount == 1) { // Let's propagate the argument if we can to avoid copies. - Propagate(ref buffer, dest, preservedArgs[index]); + PreAllocatorCommon.Propagate(ref buffer, dest, preservedArgs[index]); nextNode = node.ListNext; } else @@ -648,54 +648,6 @@ namespace ARMeilleure.CodeGen.Arm64 } } - private static void Propagate(ref Span<Operation> buffer, Operand dest, Operand value) - { - ReadOnlySpan<Operation> uses = dest.GetUses(ref buffer); - - foreach (Operation use in uses) - { - for (int srcIndex = 0; srcIndex < use.SourcesCount; srcIndex++) - { - Operand useSrc = use.GetSource(srcIndex); - - if (useSrc == dest) - { - use.SetSource(srcIndex, value); - } - else if (useSrc.Kind == OperandKind.Memory) - { - MemoryOperand memoryOp = useSrc.GetMemory(); - - Operand baseAddr = memoryOp.BaseAddress; - Operand index = memoryOp.Index; - bool changed = false; - - if (baseAddr == dest) - { - baseAddr = value; - changed = true; - } - - if (index == dest) - { - index = value; - changed = true; - } - - if (changed) - { - use.SetSource(srcIndex, MemoryOp( - useSrc.Type, - baseAddr, - index, - memoryOp.Scale, - memoryOp.Displacement)); - } - } - } - } - } - private static Operand AddFloatConstantCopy( ConstantDict constants, IntrusiveList<Operation> nodes, |