Mercurial > hg > truffle
changeset 3092:f34c90b89f54
fixes to escape analysis: propagation of VirtualObject
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Tue, 28 Jun 2011 19:54:51 +0200 |
parents | bee93b329be2 |
children | 8551bcfbba9e 2fb14099d069 f14632d52ab3 |
files | graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/LinearScan.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java |
diffstat | 2 files changed, 12 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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());
--- 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<Block> predecessors = block.getPredecessors(); Set<EscapeField> mergedFields = new HashSet<EscapeField>(); + + 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()) {