changeset 3054:fe7145755a91

LoopEnd is not a Merge anymore
author Gilles Duboscq <gilles.duboscq@oracle.com>
date Tue, 21 Jun 2011 11:44:33 +0200
parents b7f45b37dd43
children 750bec011943 00239c259a42
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopEnd.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java
diffstat 4 files changed, 29 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopEnd.java	Tue Jun 21 10:35:27 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopEnd.java	Tue Jun 21 11:44:33 2011 +0200
@@ -24,9 +24,10 @@
 
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
 
 
-public class LoopEnd extends Merge {
+public class LoopEnd extends FixedNode {
 
     private static final int INPUT_COUNT = 1;
     private static final int INPUT_LOOP_BEGIN = 0;
@@ -55,7 +56,7 @@
     }
 
     public LoopEnd(Graph graph) {
-        super(INPUT_COUNT, SUCCESSOR_COUNT, graph);
+        super(CiKind.Illegal, INPUT_COUNT, SUCCESSOR_COUNT, graph);
     }
 
     @Override
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Tue Jun 21 10:35:27 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Tue Jun 21 11:44:33 2011 +0200
@@ -45,7 +45,7 @@
 
         // remove chained Merges
         for (Merge merge : graph.getNodes(Merge.class)) {
-            if (merge.endCount() == 1 && merge.usages().size() == 0 && !(merge instanceof LoopEnd || merge instanceof LoopBegin)) {
+            if (merge.endCount() == 1 && merge.usages().size() == 0 && !(merge instanceof LoopBegin)) {
                 FixedNode next = merge.next();
                 EndNode endNode = merge.endAt(0);
                 merge.delete();
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Tue Jun 21 10:35:27 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Tue Jun 21 11:44:33 2011 +0200
@@ -286,7 +286,7 @@
         StateSplit first = (StateSplit) target.firstInstruction;
 
         if (target.isLoopHeader && isVisited(target)) {
-            first = loopBegin(target).loopEnd();
+            first = (StateSplit) loopBegin(target).loopEnd().singlePredecessor();
         }
 
         int bci = target.startBci;
@@ -317,13 +317,16 @@
                 } else {
                     Merge merge = new Merge(graph);
                     assert p.predecessors().size() == 1 : "predecessors size: " + p.predecessors().size();
-                    merge.setNext(p.next());
+                    FixedNode next = p.next();
                     p.setNext(null);
                     EndNode end = new EndNode(graph);
                     p.replace(end);
+                    merge.setNext(next);
                     merge.addEnd(end);
-                    target.firstInstruction = merge;
                     merge.setStateAfter(existingState);
+                    if (!(next instanceof LoopEnd)) {
+                        target.firstInstruction = merge;
+                    }
                     first = merge;
                 }
             }
@@ -1150,10 +1153,12 @@
                 LoopBegin loopBegin = new LoopBegin(graph);
                 LoopEnd loopEnd = new LoopEnd(graph);
                 loopEnd.setLoopBegin(loopBegin);
-                Placeholder p = new Placeholder(graph);
-                p.setNext(loopBegin.forwardEdge());
+                Placeholder pBegin = new Placeholder(graph);
+                pBegin.setNext(loopBegin.forwardEdge());
+                Placeholder pEnd = new Placeholder(graph);
+                pEnd.setNext(loopEnd);
                 loopBegin.setStateAfter(stateAfter.duplicate(block.startBci));
-                block.firstInstruction = p;
+                block.firstInstruction = pBegin;
             } else {
                 block.firstInstruction = new Placeholder(graph);
             }
@@ -1163,7 +1168,7 @@
 
         FixedNode result = null;
         if (block.isLoopHeader && isVisited(block)) {
-            result = loopBegin(block).loopEnd();
+            result = (StateSplit) loopBegin(block).loopEnd().singlePredecessor();
         } else {
             result = block.firstInstruction;
         }
@@ -1236,6 +1241,7 @@
             if (b.isLoopHeader) {
                 LoopBegin begin = loopBegin(b);
                 LoopEnd loopEnd = begin.loopEnd();
+                StateSplit loopEndPred = (StateSplit) loopEnd.singlePredecessor();
 
 //              This can happen with degenerated loops like this one:
 //                for (;;) {
@@ -1244,11 +1250,12 @@
 //                    } catch (UnresolvedException iioe) {
 //                    }
 //                }
-                if (loopEnd.stateAfter() != null) {
+                if (loopEndPred.stateAfter() != null) {
                     //loopHeaderMerge.stateBefore().merge(begin, end.stateBefore());
                     //assert loopHeaderMerge.equals(end.stateBefore());
-                    begin.stateAfter().merge(begin, loopEnd.stateAfter());
+                    begin.stateAfter().merge(begin, loopEndPred.stateAfter());
                 } else {
+                    loopEndPred.delete();
                     loopEnd.delete();
                     Merge merge = new Merge(graph);
                     merge.addEnd(begin.forwardEdge());
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java	Tue Jun 21 10:35:27 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java	Tue Jun 21 11:44:33 2011 +0200
@@ -92,6 +92,11 @@
 
     private List<LoopCounter> findLoopCounters(LoopBegin loopBegin, NodeBitMap loopNodes) {
         LoopEnd loopEnd = loopBegin.loopEnd();
+        FrameState loopEndState = null;
+        Node loopEndPred = loopEnd.singlePredecessor();
+        if (loopEndPred instanceof Merge) {
+            loopEndState = ((Merge) loopEndPred).stateAfter();
+        }
         List<Node> usages = new ArrayList<Node>(loopBegin.usages());
         List<LoopCounter> counters = new LinkedList<LoopCounter>();
         for (Node usage : usages) {
@@ -112,7 +117,7 @@
                         IntegerAdd add = (IntegerAdd) backEdge;
                         int addUsageCount = 0;
                         for (Node u : add.usages()) {
-                            if (u != loopEnd.stateAfter() && u != phi) {
+                            if (u != loopEndState && u != phi) {
                                 addUsageCount++;
                             }
                         }
@@ -130,7 +135,9 @@
                         LoopCounter counter = new LoopCounter(init.kind, init, stride, loopBegin, graph);
                         counters.add(counter);
                         phi.replace(counter);
-                        loopEnd.stateAfter().inputs().replace(backEdge, counter);
+                        if (loopEndState != null) {
+                            loopEndState.inputs().replace(backEdge, counter);
+                        }
                         if (useCounterAfterAdd) {
                             /*IntegerAdd otherInit = new IntegerAdd(init.kind, init, stride, graph); // would be nice to canonicalize
                             LoopCounter otherCounter = new LoopCounter(init.kind, otherInit, stride, loopBegin, graph);