changeset 2999:d1fd9d15eff3

Fix regression in graph builder.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Thu, 16 Jun 2011 15:10:37 +0200
parents 775881292ddb
children 6c95d57cb1e2
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BlockEnd.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java
diffstat 2 files changed, 15 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BlockEnd.java	Thu Jun 16 15:02:20 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BlockEnd.java	Thu Jun 16 15:10:37 2011 +0200
@@ -87,24 +87,6 @@
     }
 
     /**
-     * Substitutes a successor block in this block end's successor list. Note that
-     * this method updates all occurrences in the list.
-     * @param oldSucc the old successor to replace
-     * @param newSucc the new successor
-     */
-    public int substituteSuccessor(Merge oldSucc, Merge newSucc) {
-        assert newSucc != null;
-        int count = 0;
-        for (int i = 0; i < blockSuccessorCount; i++) {
-            if (blockSuccessor(i) == oldSucc) {
-                setBlockSuccessor(i, newSucc);
-                count++;
-            }
-        }
-        return count;
-    }
-
-    /**
      * Gets the successor corresponding to the default (fall through) case.
      * @return the default successor
      */
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Thu Jun 16 15:02:20 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Thu Jun 16 15:10:37 2011 +0200
@@ -297,27 +297,26 @@
             assert existingState.stackSize() == newState.stackSize();
 
             if (first instanceof Placeholder) {
+                Placeholder p = (Placeholder) first;
                 assert !target.isLoopHeader;
-                Merge merge = new Merge(graph);
-                Placeholder p = (Placeholder) first;
-                assert p.predecessors().size() == 1;
-                assert p.next() == null;
-                EndNode end = new EndNode(graph);
-                p.replace(end);
-                merge.addEnd(end);
-                target.firstInstruction = merge;
-                merge.setStateBefore(existingState);
-                first = merge;
+                if (p.predecessors().size() == 0) {
+                    p.setStateBefore(newState.duplicate(bci));
+                    return;
+                } else {
+                    Merge merge = new Merge(graph);
+                    assert p.predecessors().size() == 1 : "predecessors size: " + p.predecessors().size();
+                    assert p.next() == null;
+                    EndNode end = new EndNode(graph);
+                    p.replace(end);
+                    merge.addEnd(end);
+                    target.firstInstruction = merge;
+                    merge.setStateBefore(existingState);
+                    first = merge;
+                }
             }
 
             existingState.merge((Merge) first, newState);
         }
-
-        for (int j = 0; j < frameState.localsSize() + frameState.stackSize(); ++j) {
-            if (frameState.valueAt(j) != null) {
-                assert !frameState.valueAt(j).isDeleted();
-            }
-        }
     }
 
     private void insertLoopPhis(Merge merge, FrameState newState) {