aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/CodeGen/Arm64/PreAllocator.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-03-08 19:25:35 -0300
committerGitHub <noreply@github.com>2023-03-08 23:25:35 +0100
commitf0562b9c75308c8cfcaa2458dfd37ac42751a374 (patch)
treebdcd7c9af2ad687c7cb4f4f519ff5a6a1b6a2092 /ARMeilleure/CodeGen/Arm64/PreAllocator.cs
parentb8556530f2b160db70ff571adf25ae26d4b8f58f (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.cs86
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,