aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/CodeGen/Optimizations/Optimizer.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/CodeGen/Optimizations/Optimizer.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/CodeGen/Optimizations/Optimizer.cs')
-rw-r--r--ARMeilleure/CodeGen/Optimizations/Optimizer.cs16
1 files changed, 7 insertions, 9 deletions
diff --git a/ARMeilleure/CodeGen/Optimizations/Optimizer.cs b/ARMeilleure/CodeGen/Optimizations/Optimizer.cs
index c01a8f1e..e3117d1f 100644
--- a/ARMeilleure/CodeGen/Optimizations/Optimizer.cs
+++ b/ARMeilleure/CodeGen/Optimizations/Optimizer.cs
@@ -16,17 +16,17 @@ namespace ARMeilleure.CodeGen.Optimizations
{
modified = false;
- foreach (BasicBlock block in cfg.Blocks)
+ for (BasicBlock block = cfg.Blocks.First; block != null; block = block.ListNext)
{
- LinkedListNode<Node> node = block.Operations.First;
+ Node node = block.Operations.First;
while (node != null)
{
- LinkedListNode<Node> nextNode = node.Next;
+ Node nextNode = node.ListNext;
- bool isUnused = IsUnused(node.Value);
+ bool isUnused = IsUnused(node);
- if (!(node.Value is Operation operation) || isUnused)
+ if (!(node is Operation operation) || isUnused)
{
if (isUnused)
{
@@ -80,13 +80,11 @@ namespace ARMeilleure.CodeGen.Optimizations
}
}
- private static void RemoveNode(BasicBlock block, LinkedListNode<Node> llNode)
+ private static void RemoveNode(BasicBlock block, Node node)
{
// Remove a node from the nodes list, and also remove itself
// from all the use lists on the operands that this node uses.
- block.Operations.Remove(llNode);
-
- Node node = llNode.Value;
+ block.Operations.Remove(node);
for (int index = 0; index < node.SourcesCount; index++)
{