Mercurial > hg > truffle
changeset 9804:79d65c694a3b
Make escape analysis and phi nodes more robust with additional assertions.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Thu, 23 May 2013 16:49:01 +0200 |
parents | 8e33b4ebfef1 |
children | 53bc0557baaf |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualizerToolImpl.java |
diffstat | 3 files changed, 13 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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); }
--- 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); } } }
--- 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); } }