# HG changeset patch # User Lukas Stadler # Date 1309283691 -7200 # Node ID f34c90b89f5462bc677ad563005539208d7f007a # Parent bee93b329be276aa55c113f9af0acfe0324c814b fixes to escape analysis: propagation of VirtualObject diff -r bee93b329be2 -r f34c90b89f54 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/LinearScan.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/LinearScan.java Tue Jun 28 19:22:42 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/LinearScan.java Tue Jun 28 19:54:51 2011 +0200 @@ -1904,18 +1904,20 @@ do { boolean found = false; for (int i = 0; i < escapeFields.length; i++) { - if (escapeFields[i] == current.field() && values[i] == null) { - values[i] = toCiValue(opId, current.input()); + if (escapeFields[i].representation() == current.field().representation()) { + if (values[i] == null) { + values[i] = toCiValue(opId, current.input()); + } found = true; break; } } - assert found; + assert found : type + "." + current.field() + " not found"; current = current.object(); } while (current != null); - for (CiValue val : values) { -// assert val != null; + for (int i = 0; i < escapeFields.length; i++) { + assert values[i] != null : type + "." + escapeFields[i]; } CiVirtualObject vobj = CiVirtualObject.get(type, values, obj.id()); diff -r bee93b329be2 -r f34c90b89f54 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java Tue Jun 28 19:22:42 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java Tue Jun 28 19:54:51 2011 +0200 @@ -111,10 +111,15 @@ } else { List predecessors = block.getPredecessors(); Set mergedFields = new HashSet(); + + BlockExitState predState = exitStates.get(predecessors.get(0)); + state.obj = predState == null ? null : predState.obj; + for (int i = 0; i < predecessors.size(); i++) { BlockExitState exitState = exitStates.get(predecessors.get(i)); if (exitState == null) { mergedFields.addAll(fields.values()); + state.obj = null; break; } else { for (EscapeField field : fields.values()) {