Mercurial > hg > truffle
diff graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java @ 5129:51111665eda6
Support for recording a leaf graph id for each deoptimization point in the debug info.
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Wed, 21 Mar 2012 10:47:02 +0100 |
parents | e808627bd16f |
children | ab038e0d6b43 |
line wrap: on
line diff
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri Mar 16 11:03:54 2012 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Wed Mar 21 10:47:02 2012 +0100 @@ -27,6 +27,7 @@ import java.lang.reflect.*; import java.util.*; +import java.util.concurrent.atomic.*; import com.oracle.max.cri.ci.*; @@ -89,10 +90,9 @@ private BitSet canTrapBitSet; - public static final Map<RiMethod, StructuredGraph> cachedGraphs = new WeakHashMap<>(); - private final GraphBuilderConfiguration config; + private long graphId; /** * Node that marks the begin of block during bytecode parsing. When a block is identified the first @@ -120,6 +120,7 @@ @Override protected void run(StructuredGraph graph) { method = graph.method(); + graphId = graph.graphId(); profilingInfo = method.profilingInfo(); assert method.code() != null : "method must contain bytecodes: " + method; this.stream = new BytecodeStream(method.code()); @@ -201,10 +202,6 @@ n.safeDelete(); } } - - if (GraalOptions.CacheGraphs && !currentGraph.hasNode(DeoptimizeNode.class)) { - cachedGraphs.put(method, currentGraph.copy()); - } } private Block unwindBlock(int bci) { @@ -328,7 +325,7 @@ if (riType instanceof RiResolvedType) { frameState.push(CiKind.Object, append(ConstantNode.forCiConstant(((RiResolvedType) riType).getEncoding(Representation.JavaClass), runtime, currentGraph))); } else { - append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graphId))); frameState.push(CiKind.Object, append(ConstantNode.forObject(null, runtime, currentGraph))); } } else if (con instanceof CiConstant) { @@ -345,7 +342,7 @@ ValueNode index = frameState.ipop(); ValueNode array = frameState.apop(); ValueNode length = append(currentGraph.add(new ArrayLengthNode(array))); - ValueNode v = append(currentGraph.add(new LoadIndexedNode(array, index, length, kind))); + ValueNode v = append(currentGraph.add(new LoadIndexedNode(array, index, length, kind, graphId))); frameState.push(kind.stackKind(), v); } @@ -356,7 +353,7 @@ ValueNode index = frameState.ipop(); ValueNode array = frameState.apop(); ValueNode length = append(currentGraph.add(new ArrayLengthNode(array))); - StoreIndexedNode result = currentGraph.add(new StoreIndexedNode(array, index, length, kind, value)); + StoreIndexedNode result = currentGraph.add(new StoreIndexedNode(array, index, length, kind, value, graphId)); append(result); } @@ -587,7 +584,7 @@ private void genThrow(int bci) { ValueNode exception = frameState.apop(); - FixedGuardNode node = currentGraph.add(new FixedGuardNode(currentGraph.unique(new NullCheckNode(exception, false)))); + FixedGuardNode node = currentGraph.add(new FixedGuardNode(currentGraph.unique(new NullCheckNode(exception, false)), graphId)); append(node); append(handleException(exception, bci)); } @@ -679,7 +676,7 @@ frameState.apush(checkCast); } else { ValueNode object = frameState.apop(); - append(currentGraph.add(new FixedGuardNode(currentGraph.unique(new CompareNode(object, Condition.EQ, ConstantNode.forObject(null, runtime, currentGraph)))))); + append(currentGraph.add(new FixedGuardNode(currentGraph.unique(new CompareNode(object, Condition.EQ, ConstantNode.forObject(null, runtime, currentGraph))), graphId))); frameState.apush(appendConstant(CiConstant.NULL_OBJECT)); } } @@ -697,7 +694,7 @@ frameState.ipush(append(MaterializeNode.create(currentGraph.unique(instanceOfNode), currentGraph))); } else { BlockPlaceholderNode trueSucc = currentGraph.add(new BlockPlaceholderNode()); - DeoptimizeNode deopt = currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile)); + DeoptimizeNode deopt = currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graphId)); IfNode ifNode = currentGraph.add(new IfNode(currentGraph.unique(new NullCheckNode(object, true)), trueSucc, deopt, 1)); append(ifNode); lastInstr = trueSucc; @@ -711,7 +708,7 @@ NewInstanceNode n = currentGraph.add(new NewInstanceNode((RiResolvedType) type)); frameState.apush(append(n)); } else { - append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graphId))); frameState.apush(appendConstant(CiConstant.NULL_OBJECT)); } } @@ -752,7 +749,7 @@ NewArrayNode n = currentGraph.add(new NewObjectArrayNode((RiResolvedType) type, length)); frameState.apush(append(n)); } else { - append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graphId))); frameState.apush(appendConstant(CiConstant.NULL_OBJECT)); } @@ -769,7 +766,7 @@ FixedWithNextNode n = currentGraph.add(new NewMultiArrayNode((RiResolvedType) type, dims)); frameState.apush(append(n)); } else { - append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graphId))); frameState.apush(appendConstant(CiConstant.NULL_OBJECT)); } } @@ -783,7 +780,7 @@ LoadFieldNode load = currentGraph.add(new LoadFieldNode(receiver, (RiResolvedField) field)); appendOptimizedLoadField(kind, load); } else { - append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graphId))); frameState.push(kind.stackKind(), append(ConstantNode.defaultForKind(kind, currentGraph))); } } @@ -884,7 +881,7 @@ StoreFieldNode store = currentGraph.add(new StoreFieldNode(receiver, (RiResolvedField) field, value)); appendOptimizedStoreField(store); } else { - append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graphId))); } } @@ -926,7 +923,7 @@ if (initialized) { return appendConstant(((RiResolvedType) holder).getEncoding(representation)); } else { - append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graphId))); return null; } } @@ -987,7 +984,7 @@ } private void genInvokeDeopt(RiMethod unresolvedTarget, boolean withReceiver) { - append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graphId))); frameState.popArguments(unresolvedTarget.signature().argumentSlots(withReceiver), unresolvedTarget.signature().argumentCount(withReceiver)); CiKind kind = unresolvedTarget.signature().returnKind(false); if (kind != CiKind.Void) { @@ -1024,7 +1021,7 @@ private void appendInvoke(InvokeKind invokeKind, RiResolvedMethod targetMethod, ValueNode[] args) { CiKind resultType = targetMethod.signature().returnKind(false); if (GraalOptions.DeoptALot) { - DeoptimizeNode deoptimize = currentGraph.add(new DeoptimizeNode(DeoptAction.None)); + DeoptimizeNode deoptimize = currentGraph.add(new DeoptimizeNode(DeoptAction.None, StructuredGraph.INVALID_GRAPH_ID)); deoptimize.setMessage("invoke " + targetMethod.name()); append(deoptimize); frameState.pushReturn(resultType, ConstantNode.defaultForKind(resultType, currentGraph)); @@ -1033,7 +1030,7 @@ BeginNode exceptionEdge = handleException(null, bci()); ValueNode result; if (exceptionEdge != null) { - InvokeWithExceptionNode invoke = currentGraph.add(new InvokeWithExceptionNode(callTarget, exceptionEdge, bci())); + InvokeWithExceptionNode invoke = currentGraph.add(new InvokeWithExceptionNode(callTarget, exceptionEdge, bci(), graphId)); result = append(invoke); frameState.pushReturn(resultType, result); Block nextBlock = currentBlock.successors.get(0); @@ -1044,7 +1041,7 @@ invoke.setNext(createTarget(nextBlock, frameState)); invoke.setStateAfter(frameState.create(nextBlock.startBci)); } else { - result = appendWithBCI(currentGraph.add(new InvokeNode(callTarget, bci()))); + result = appendWithBCI(currentGraph.add(new InvokeNode(callTarget, bci(), graphId))); frameState.pushReturn(resultType, result); } } @@ -1113,7 +1110,7 @@ ValueNode local = frameState.loadLocal(localIndex); JsrScope scope = currentBlock.jsrScope; int retAddress = scope.nextReturnAddress(); - append(currentGraph.add(new FixedGuardNode(currentGraph.unique(new CompareNode(local, Condition.EQ, ConstantNode.forJsr(retAddress, currentGraph)))))); + append(currentGraph.add(new FixedGuardNode(currentGraph.unique(new CompareNode(local, Condition.EQ, ConstantNode.forJsr(retAddress, currentGraph))), graphId))); if (!successor.jsrScope.equals(scope.pop())) { throw new JsrNotSupportedBailout("unstructured control flow (ret leaves more than one scope)"); } @@ -1199,7 +1196,7 @@ private FixedNode createTarget(double probability, Block block, FrameStateBuilder stateAfter) { assert probability >= 0 && probability <= 1; if (probability == 0 && config.useBranchPrediction()) { - return currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateReprofile)); + return currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateReprofile, graphId)); } else { return createTarget(block, stateAfter); }