Mercurial > hg > graal-compiler
changeset 22528:b1d4fd32135f
Use worklist instead of quadratic algorithm in DebugInfoBuilder.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Fri, 28 Aug 2015 13:46:09 +0200 |
parents | c9ebb39f4582 |
children | 5b0239e1d562 |
files | graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java |
diffstat | 1 files changed, 37 insertions(+), 41 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java Fri Aug 28 13:36:09 2015 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java Fri Aug 28 13:46:09 2015 +0200 @@ -23,8 +23,12 @@ package com.oracle.graal.compiler.gen; import java.util.*; -import java.util.Map.*; +import jdk.internal.jvmci.code.*; +import jdk.internal.jvmci.common.*; +import jdk.internal.jvmci.meta.*; + +import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.lir.*; import com.oracle.graal.nodes.*; @@ -33,11 +37,6 @@ import com.oracle.graal.nodes.virtual.*; import com.oracle.graal.virtual.nodes.*; -import jdk.internal.jvmci.code.*; -import jdk.internal.jvmci.common.*; -import com.oracle.graal.debug.*; -import jdk.internal.jvmci.meta.*; - /** * Builds {@link LIRFrameState}s from {@link FrameState}s. */ @@ -52,9 +51,12 @@ protected final Map<VirtualObjectNode, VirtualObject> virtualObjects = Node.newMap(); protected final Map<VirtualObjectNode, EscapeObjectState> objectStates = Node.newIdentityMap(); + protected final Queue<VirtualObjectNode> pendingVirtualObjects = new ArrayDeque<>(); + public LIRFrameState build(FrameState topState, LabelRef exceptionEdge) { assert virtualObjects.size() == 0; assert objectStates.size() == 0; + assert pendingVirtualObjects.size() == 0; // collect all VirtualObjectField instances: FrameState current = topState; @@ -75,43 +77,36 @@ VirtualObject[] virtualObjectsArray = null; if (virtualObjects.size() != 0) { - // fill in the VirtualObject values: - // during this process new VirtualObjects might be discovered, so repeat until no more - // changes occur. - boolean changed; - do { - changed = false; - Map<VirtualObjectNode, VirtualObject> virtualObjectsCopy = Node.newIdentityMap(virtualObjects); - for (Entry<VirtualObjectNode, VirtualObject> entry : virtualObjectsCopy.entrySet()) { - if (entry.getValue().getValues() == null) { - VirtualObjectNode vobj = entry.getKey(); - JavaValue[] values = new JavaValue[vobj.entryCount()]; - Kind[] slotKinds = new Kind[vobj.entryCount()]; - if (values.length > 0) { - changed = true; - VirtualObjectState currentField = (VirtualObjectState) objectStates.get(vobj); - assert currentField != null; - int pos = 0; - for (int i = 0; i < vobj.entryCount(); i++) { - if (!currentField.values().get(i).isConstant() || currentField.values().get(i).asJavaConstant().getKind() != Kind.Illegal) { - ValueNode value = currentField.values().get(i); - values[pos] = toJavaValue(value); - slotKinds[pos] = toSlotKind(value); - pos++; - } else { - assert currentField.values().get(i - 1).getStackKind() == Kind.Double || currentField.values().get(i - 1).getStackKind() == Kind.Long : vobj + " " + i + " " + - currentField.values().get(i - 1); - } - } - if (pos != vobj.entryCount()) { - values = Arrays.copyOf(values, pos); - slotKinds = Arrays.copyOf(slotKinds, pos); - } + // fill in the VirtualObject values + VirtualObjectNode vobjNode; + while ((vobjNode = pendingVirtualObjects.poll()) != null) { + VirtualObject vobjValue = virtualObjects.get(vobjNode); + assert vobjValue.getValues() == null; + + JavaValue[] values = new JavaValue[vobjNode.entryCount()]; + Kind[] slotKinds = new Kind[vobjNode.entryCount()]; + if (values.length > 0) { + VirtualObjectState currentField = (VirtualObjectState) objectStates.get(vobjNode); + assert currentField != null; + int pos = 0; + for (int i = 0; i < vobjNode.entryCount(); i++) { + if (!currentField.values().get(i).isConstant() || currentField.values().get(i).asJavaConstant().getKind() != Kind.Illegal) { + ValueNode value = currentField.values().get(i); + values[pos] = toJavaValue(value); + slotKinds[pos] = toSlotKind(value); + pos++; + } else { + assert currentField.values().get(i - 1).getStackKind() == Kind.Double || currentField.values().get(i - 1).getStackKind() == Kind.Long : vobjNode + " " + i + " " + + currentField.values().get(i - 1); } - entry.getValue().setValues(values, slotKinds); + } + if (pos != vobjNode.entryCount()) { + values = Arrays.copyOf(values, pos); + slotKinds = Arrays.copyOf(slotKinds, pos); } } - } while (changed); + vobjValue.setValues(values, slotKinds); + } virtualObjectsArray = virtualObjects.values().toArray(new VirtualObject[virtualObjects.size()]); virtualObjects.clear(); @@ -208,10 +203,11 @@ return toJavaValue(((MaterializedObjectState) state).materializedValue()); } else { assert obj.entryCount() == 0 || state instanceof VirtualObjectState; - VirtualObject vobject = virtualObjects.get(value); + VirtualObject vobject = virtualObjects.get(obj); if (vobject == null) { vobject = VirtualObject.get(obj.type(), virtualObjects.size()); virtualObjects.put(obj, vobject); + pendingVirtualObjects.add(obj); } STATE_VIRTUAL_OBJECTS.increment(); return vobject;