# HG changeset patch # User Gilles Duboscq # Date 1380032519 -7200 # Node ID 713a08116e97c6a745e6b84e542fb9340733d842 # Parent a2958b7bf83f1c83f02f7aa51b84d495b19011ba Fix SnippetFrameStateCleanupPhase's handling of Merges: if there is no statesplit after a merge, the last statesplit inside the merges's incomming branches should get an AFTER_BCI Use a stronger assert in DebugInfoBuilder.computeFrameForState diff -r a2958b7bf83f -r 713a08116e97 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java Wed Sep 25 12:17:55 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java Tue Sep 24 16:21:59 2013 +0200 @@ -122,7 +122,7 @@ if (state.outerFrameState() != null) { caller = computeFrameForState(state.outerFrameState()); } - assert state.bci != FrameState.UNKNOWN_BCI : "bci == " + state.bci; + assert state.bci >= FrameState.BEFORE_BCI : "bci == " + state.bci; return new BytecodeFrame(caller, state.method(), state.bci, state.rethrowException(), state.duringCall(), values, numLocals, numStack, numLocks); } diff -r a2958b7bf83f -r 713a08116e97 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetFrameStateCleanupPhase.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetFrameStateCleanupPhase.java Wed Sep 25 12:17:55 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetFrameStateCleanupPhase.java Tue Sep 24 16:21:59 2013 +0200 @@ -57,7 +57,8 @@ StateSplit stateSplit = (StateSplit) node; FrameState frameState = stateSplit.stateAfter(); if (frameState != null) { - if (stateSplit.hasSideEffect()) { + // the stateSplit == currentState case comes from merge handling + if (stateSplit.hasSideEffect() || stateSplit == currentState) { stateSplit.setStateAfter(createInvalidFrameState(node)); state = stateSplit; } else if (hasInvalidState(state)) { @@ -78,7 +79,19 @@ @Override protected StateSplit merge(MergeNode merge, List states) { - return merge; + boolean invalid = false; + for (StateSplit state : states) { + if (state != null && state.stateAfter() != null && state.stateAfter().bci == FrameState.INVALID_FRAMESTATE_BCI) { + invalid = true; + state.setStateAfter(merge.graph().add(new FrameState(FrameState.AFTER_BCI))); + } + } + if (invalid) { + // at the next processNode call, stateSplit == currentState == merge + return merge; + } else { + return null; + } } @Override @@ -103,7 +116,8 @@ } private static boolean hasInvalidState(StateSplit state) { - return state != null && state.stateAfter() != null && state.stateAfter().bci == FrameState.INVALID_FRAMESTATE_BCI; + assert state == null || (state.stateAfter() != null && state.stateAfter().bci == FrameState.INVALID_FRAMESTATE_BCI) : state + " " + state.stateAfter(); + return state != null; } private static FrameState createInvalidFrameState(FixedNode node) { diff -r a2958b7bf83f -r 713a08116e97 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java Wed Sep 25 12:17:55 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java Tue Sep 24 16:21:59 2013 +0200 @@ -141,13 +141,11 @@ if (call.targetMethod() != getTargetMethod()) { throw new GraalInternalError("unexpected invoke %s in snippet", getClass().getSimpleName()); } - if (invoke.stateAfter().bci == FrameState.INVALID_FRAMESTATE_BCI) { - InvokeNode newInvoke = snippetGraph.add(new InvokeNode(invoke.callTarget(), getBci())); - newInvoke.setStateAfter(snippetGraph.add(new FrameState(FrameState.AFTER_BCI))); - snippetGraph.replaceFixedWithFixed((InvokeNode) invoke.asNode(), newInvoke); - } else { - assert invoke.stateAfter().bci == FrameState.AFTER_BCI : invoke; - } + assert invoke.stateAfter().bci == FrameState.AFTER_BCI; + // Here we need to fix the bci of the invoke + InvokeNode newInvoke = snippetGraph.add(new InvokeNode(invoke.callTarget(), getBci())); + newInvoke.setStateAfter(invoke.stateAfter()); + snippetGraph.replaceFixedWithFixed((InvokeNode) invoke.asNode(), newInvoke); } }