aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Translation/ControlFlowGraph.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-02-17 18:30:54 -0300
committerGitHub <noreply@github.com>2020-02-17 22:30:54 +0100
commite5f78fb1d44b825ee9195660f4387680055137dc (patch)
tree59cfa56dc046bd27aa1d7e9d7b0840ffafd9f601 /ARMeilleure/Translation/ControlFlowGraph.cs
parente9a37ca6a85346c05149deac916dc90de43ad240 (diff)
Replace LinkedList by IntrusiveList to avoid allocations on JIT (#931)
* Replace LinkedList by IntrusiveList to avoid allocations on JIT * Fix wrong replacements
Diffstat (limited to 'ARMeilleure/Translation/ControlFlowGraph.cs')
-rw-r--r--ARMeilleure/Translation/ControlFlowGraph.cs24
1 files changed, 11 insertions, 13 deletions
diff --git a/ARMeilleure/Translation/ControlFlowGraph.cs b/ARMeilleure/Translation/ControlFlowGraph.cs
index 758f1f96..37613eb4 100644
--- a/ARMeilleure/Translation/ControlFlowGraph.cs
+++ b/ARMeilleure/Translation/ControlFlowGraph.cs
@@ -9,13 +9,13 @@ namespace ARMeilleure.Translation
{
public BasicBlock Entry { get; }
- public LinkedList<BasicBlock> Blocks { get; }
+ public IntrusiveList<BasicBlock> Blocks { get; }
public BasicBlock[] PostOrderBlocks { get; }
public int[] PostOrderMap { get; }
- public ControlFlowGraph(BasicBlock entry, LinkedList<BasicBlock> blocks)
+ public ControlFlowGraph(BasicBlock entry, IntrusiveList<BasicBlock> blocks)
{
Entry = entry;
Blocks = blocks;
@@ -57,7 +57,7 @@ namespace ARMeilleure.Translation
}
}
- private void RemoveUnreachableBlocks(LinkedList<BasicBlock> blocks)
+ private void RemoveUnreachableBlocks(IntrusiveList<BasicBlock> blocks)
{
HashSet<BasicBlock> visited = new HashSet<BasicBlock>();
@@ -87,25 +87,23 @@ namespace ARMeilleure.Translation
// Remove unreachable blocks and renumber.
int index = 0;
- for (LinkedListNode<BasicBlock> node = blocks.First; node != null;)
+ for (BasicBlock block = blocks.First; block != null;)
{
- LinkedListNode<BasicBlock> nextNode = node.Next;
-
- BasicBlock block = node.Value;
+ BasicBlock nextBlock = block.ListNext;
if (!visited.Contains(block))
{
- block.Next = null;
+ block.Next = null;
block.Branch = null;
- blocks.Remove(node);
+ blocks.Remove(block);
}
else
{
block.Index = index++;
}
- node = nextNode;
+ block = nextBlock;
}
}
}
@@ -130,7 +128,7 @@ namespace ARMeilleure.Translation
}
// Insert the new block on the list of blocks.
- BasicBlock succPrev = successor.Node.Previous?.Value;
+ BasicBlock succPrev = successor.ListPrevious;
if (succPrev != null && succPrev != predecessor && succPrev.Next == successor)
{
@@ -145,12 +143,12 @@ namespace ARMeilleure.Translation
splitBlock2.Operations.AddLast(new Operation(Instruction.Branch, null));
- Blocks.AddBefore(successor.Node, splitBlock2);
+ Blocks.AddBefore(successor, splitBlock2);
}
splitBlock.Next = successor;
- Blocks.AddBefore(successor.Node, splitBlock);
+ Blocks.AddBefore(successor, splitBlock);
return splitBlock;
}