# HG changeset patch # User Thomas Wuerthinger # Date 1308241876 -7200 # Node ID 6264ecd38bc251505926ab1e28de8685d44bfb5e # Parent 53dcb07946194705666442be3dac24a530f7c9a8 Clean up dead code elimination. diff -r 53dcb0794619 -r 6264ecd38bc2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalMetrics.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalMetrics.java Thu Jun 16 17:39:29 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalMetrics.java Thu Jun 16 18:31:16 2011 +0200 @@ -65,11 +65,10 @@ public static int NodesCanonicalized; public static void print() { - printClassFields(GraalMetrics.class); - for (Entry m : map.entrySet()) { printField(m.getKey(), m.getValue().value); } + printClassFields(GraalMetrics.class); } private static LinkedHashMap map = new LinkedHashMap(); diff -r 53dcb0794619 -r 6264ecd38bc2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Thu Jun 16 17:39:29 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Thu Jun 16 18:31:16 2011 +0200 @@ -55,10 +55,11 @@ iterateSuccessors(); disconnectCFGNodes(); + iterateInputs(); + disconnectNodes(); + deleteNodes(); + deleteBrokenLoops(); - iterateInputs(); - disconnectNonCFGNodes(); - deleteNodes(); new PhiSimplifier(graph); @@ -87,10 +88,7 @@ private void disconnectCFGNodes() { for (Node node : graph.getNodes()) { if (node != Node.Null && !flood.isMarked(node)) { - if (isCFG(node)) { - node.successors().clearAll(); - node.inputs().clearAll(); - } else if (node instanceof EndNode) { + if (node instanceof EndNode) { EndNode end = (EndNode) node; Merge merge = end.merge(); if (merge != null && flood.isMarked(merge)) { @@ -117,7 +115,7 @@ private void deleteNodes() { for (Node node : graph.getNodes()) { if (node != Node.Null && !flood.isMarked(node)) { - node.delete(); + node.unsafeDelete(); } } } @@ -129,25 +127,26 @@ } if (node != Node.Null && flood.isMarked(node)) { for (Node input : node.inputs()) { - if (!isCFG(input)) { - flood.add(input); - } + flood.add(input); } } } for (Node current : flood) { for (Node input : current.inputs()) { - if (!isCFG(input)) { - flood.add(input); - } + flood.add(input); } } } - private void disconnectNonCFGNodes() { + private void disconnectNodes() { for (Node node : graph.getNodes()) { - if (node != Node.Null && !flood.isMarked(node) && !isCFG(node)) { - node.inputs().clearAll(); + if (node != Node.Null && !flood.isMarked(node)) { + for (int i = 0; i < node.inputs().size(); i++) { + Node input = node.inputs().get(i); + if (input != Node.Null && flood.isMarked(input)) { + node.inputs().set(i, Node.Null); + } + } } } } diff -r 53dcb0794619 -r 6264ecd38bc2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/Phase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/Phase.java Thu Jun 16 17:39:29 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/Phase.java Thu Jun 16 18:31:16 2011 +0200 @@ -23,6 +23,7 @@ package com.oracle.max.graal.compiler.phases; import com.oracle.max.graal.compiler.*; +import com.oracle.max.graal.compiler.debug.*; import com.oracle.max.graal.compiler.observer.*; import com.oracle.max.graal.compiler.schedule.*; import com.oracle.max.graal.graph.Graph; diff -r 53dcb0794619 -r 6264ecd38bc2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Thu Jun 16 17:39:29 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Thu Jun 16 18:31:16 2011 +0200 @@ -226,6 +226,8 @@ return null; } + assert !n.isDeleted(); + Block prevBlock = nodeToBlock.get(n); if (prevBlock != null) { return prevBlock; diff -r 53dcb0794619 -r 6264ecd38bc2 graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Node.java --- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Node.java Thu Jun 16 17:39:29 2011 +0200 +++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Node.java Thu Jun 16 18:31:16 2011 +0200 @@ -123,6 +123,12 @@ predecessors.clear(); } + public void unsafeDelete() { + graph.unregister(this); + id = DeletedID; + assert isDeleted(); + } + public void delete() { assert !isDeleted(); assert checkDeletion() : "Could not delete " + this + " (usages: " + this.usages() + ", predecessors: " + this.predecessors() + ")"; @@ -134,10 +140,7 @@ successors.set(i, Null); } assert predecessors().size() == 0 && usages().size() == 0; - // make sure its not connected. pred usages - graph.unregister(this); - id = DeletedID; - assert isDeleted(); + unsafeDelete(); } private boolean checkDeletion() { diff -r 53dcb0794619 -r 6264ecd38bc2 graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeArray.java --- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeArray.java Thu Jun 16 17:39:29 2011 +0200 +++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeArray.java Thu Jun 16 18:31:16 2011 +0200 @@ -173,6 +173,7 @@ @Override public Node get(int index) { checkIndex(index); + assert !self().isDeleted(); return nodes[index]; }