diff options
author | gdkchan <gab.dark.100@gmail.com> | 2020-02-17 18:30:54 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-17 22:30:54 +0100 |
commit | e5f78fb1d44b825ee9195660f4387680055137dc (patch) | |
tree | 59cfa56dc046bd27aa1d7e9d7b0840ffafd9f601 /ARMeilleure/Translation/ControlFlowGraph.cs | |
parent | e9a37ca6a85346c05149deac916dc90de43ad240 (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.cs | 24 |
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; } |