# HG changeset patch # User Christian Wimmer # Date 1331147174 28800 # Node ID 2eb3c0920cf16698bf6760fba10207661c3188fa # Parent e87460fbd2f15a2bf22b6a5fe3d6ce9da210e6fe Fix performance regression: When never executed code is not compiled, deoptimize before the branch so that interpreter updates profiling information. diff -r e87460fbd2f1 -r 2eb3c0920cf1 graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java Wed Mar 07 10:09:55 2012 -0800 +++ b/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java Wed Mar 07 11:06:14 2012 -0800 @@ -1264,14 +1264,12 @@ */ private BeginNode createBlockTarget(double probability, Block block, FrameStateBuilder stateAfter) { assert probability >= 0 && probability <= 1; - if (probability == 0) { - FrameStateBuilder state = stateAfter.copy(); - state.clearNonLiveLocals(block.localsLiveIn); - + if (probability == 0 && config.useBranchPrediction()) { BeginNode begin = currentGraph.add(new BeginNode()); DeoptimizeNode deopt = currentGraph.add(new DeoptimizeNode(DeoptAction.InvalidateReprofile)); begin.setNext(deopt); - begin.setStateAfter(state.create(block.startBci)); + // Note: We are not allowed to set the stateAfter of the begin node, because we have to deoptimize to + // a bci _before_ the actual if, so that the interpreter can update the profiling information. return begin; }