# HG changeset patch # User Thomas Wuerthinger # Date 1369320541 -7200 # Node ID 79d65c694a3bcddf30687df9c807baa375e3b62b # Parent 8e33b4ebfef1e16ba6c3590955239ffa882f2b6c Make escape analysis and phi nodes more robust with additional assertions. diff -r 8e33b4ebfef1 -r 79d65c694a3b graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java Thu May 23 13:14:08 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java Thu May 23 16:49:01 2013 +0200 @@ -199,6 +199,7 @@ public void addInput(ValueNode x) { assert !(x instanceof PhiNode) || ((PhiNode) x).merge() instanceof LoopBeginNode || ((PhiNode) x).merge() != this.merge(); + assert x.kind() == kind() || type != PhiType.Value; values.add(x); } diff -r 8e33b4ebfef1 -r 79d65c694a3b graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Thu May 23 13:14:08 2013 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Thu May 23 16:49:01 2013 +0200 @@ -521,7 +521,13 @@ for (int i = 1; i < states.size(); i++) { ValueNode[] fields = objStates[i].getEntries(); if (phis[index] == null && values[index] != fields[index]) { - phis[index] = new PhiNode(values[index].kind(), merge); + Kind kind = values[index].kind(); + if (kind == Kind.Illegal) { + // Can happen if one of the values is virtual and is only + // materialized in the following loop. + kind = Kind.Object; + } + phis[index] = new PhiNode(kind, merge); } } } diff -r 8e33b4ebfef1 -r 79d65c694a3b graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualizerToolImpl.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualizerToolImpl.java Thu May 23 13:14:08 2013 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualizerToolImpl.java Thu May 23 16:49:01 2013 +0200 @@ -91,11 +91,12 @@ if (valueState == null) { obj.setEntry(index, getReplacedValue(value)); } else { - if (valueState.getState() == EscapeState.Virtual) { - obj.setEntry(index, value); - } else { - obj.setEntry(index, valueState.getMaterializedValue()); + ValueNode newValue = value; + if (valueState.getState() != EscapeState.Virtual) { + newValue = valueState.getMaterializedValue(); } + assert obj.getEntry(index) == null || obj.getEntry(index).kind() == newValue.kind(); + obj.setEntry(index, newValue); } }