From e5f78fb1d44b825ee9195660f4387680055137dc Mon Sep 17 00:00:00 2001
From: gdkchan <gab.dark.100@gmail.com>
Date: Mon, 17 Feb 2020 18:30:54 -0300
Subject: Replace LinkedList by IntrusiveList to avoid allocations on JIT
 (#931)

* Replace LinkedList by IntrusiveList to avoid allocations on JIT

* Fix wrong replacements
---
 ARMeilleure/Translation/ControlFlowGraph.cs | 24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

(limited to 'ARMeilleure/Translation/ControlFlowGraph.cs')

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;
         }
-- 
cgit v1.2.3-70-g09d2