Mercurial > hg > graal-compiler
diff graal/GraalCompiler/src/com/sun/c1x/graph/DeadCodeElimination.java @ 2868:6d24c27902a2
turned inlining into a phase, some node cloning fixes, added NodeWorklist
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Tue, 07 Jun 2011 19:19:14 +0200 |
parents | 5c545fef2c81 |
children |
line wrap: on
line diff
--- a/graal/GraalCompiler/src/com/sun/c1x/graph/DeadCodeElimination.java Tue Jun 07 16:33:04 2011 +0200 +++ b/graal/GraalCompiler/src/com/sun/c1x/graph/DeadCodeElimination.java Tue Jun 07 19:19:14 2011 +0200 @@ -22,10 +22,7 @@ */ package com.sun.c1x.graph; -import java.util.*; - import com.oracle.graal.graph.*; -import com.oracle.max.graal.schedule.*; import com.sun.c1x.*; import com.sun.c1x.gen.*; import com.sun.c1x.ir.*; @@ -34,7 +31,7 @@ public class DeadCodeElimination extends Phase { private NodeBitMap alive; - private Queue<Node> worklist; + private NodeWorklist worklist; private Graph graph; public int deletedNodeCount; @@ -43,9 +40,9 @@ protected void run(Graph graph) { this.graph = graph; this.alive = graph.createNodeBitMap(); - this.worklist = new ArrayDeque<Node>(); + this.worklist = graph.createNodeWorklist(); - addToWorklist(graph.start()); + worklist.add(graph.start()); iterateSuccessors(); disconnectCFGNodes(); @@ -63,22 +60,25 @@ } } + private static boolean isCFG(Node n) { + return n != null && ((n instanceof Instruction) || n == n.graph().start()); + } + private void iterateSuccessors() { - Node current; - while ((current = nextNode()) != null) { + for (Node current : worklist) { for (Node successor : current.successors()) { - addToWorklist(successor); + worklist.add(successor); } } } private void disconnectCFGNodes() { for (Node node : graph.getNodes()) { - if (node != Node.Null && !alive.isMarked(node) && Schedule.isCFG(node)) { + if (node != Node.Null && !worklist.isMarked(node) && isCFG(node)) { // iterate backwards so that the predecessor indexes in removePhiPredecessor are correct for (int i = node.successors().size() - 1; i >= 0; i--) { Node successor = node.successors().get(i); - if (successor != Node.Null && alive.isMarked(successor)) { + if (successor != Node.Null && worklist.isMarked(successor)) { if (successor instanceof Merge) { ((Merge) successor).removePhiPredecessor(node); } @@ -92,7 +92,7 @@ private void deleteCFGNodes() { for (Node node : graph.getNodes()) { - if (node != Node.Null && !alive.isMarked(node) && Schedule.isCFG(node)) { + if (node != Node.Null && !worklist.isMarked(node) && isCFG(node)) { node.delete(); deletedNodeCount++; } @@ -101,23 +101,22 @@ private void iterateInputs() { for (Node node : graph.getNodes()) { - if (node != Node.Null && alive.isMarked(node)) { + if (node != Node.Null && worklist.isMarked(node)) { for (Node input : node.inputs()) { - addToWorklist(input); + worklist.add(input); } } } - Node current; - while ((current = nextNode()) != null) { + for (Node current : worklist) { for (Node input : current.inputs()) { - addToWorklist(input); + worklist.add(input); } } } private void disconnectNonCFGNodes() { for (Node node : graph.getNodes()) { - if (node != Node.Null && !alive.isMarked(node) && !Schedule.isCFG(node)) { + if (node != Node.Null && !worklist.isMarked(node) && !isCFG(node)) { node.inputs().clearAll(); } } @@ -125,21 +124,10 @@ private void deleteNonCFGNodes() { for (Node node : graph.getNodes()) { - if (node != Node.Null && !alive.isMarked(node) && !Schedule.isCFG(node)) { + if (node != Node.Null && !worklist.isMarked(node) && !isCFG(node)) { node.delete(); deletedNodeCount++; } } } - - private Node nextNode() { - return worklist.poll(); - } - - private void addToWorklist(Node node) { - if (node != null && !alive.isMarked(node)) { - alive.mark(node); - worklist.add(node); - } - } }