# HG changeset patch # User Gilles Duboscq # Date 1340722308 -7200 # Node ID a63ed59939875f79f9bc68d50c6b73e807a95a46 # Parent 493e8d932148538dcf2e80782ff34bf755b1c991 Add leadGraphID to IfNOde so that we can convert them to deopts Add a phase that transforms If with a 0-1 probability to guards diff -r 493e8d932148 -r a63ed5993987 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Tue Jun 26 16:50:43 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Tue Jun 26 16:51:48 2012 +0200 @@ -149,6 +149,7 @@ } } + new ConvertUnreachedToGuardPhase(optimisticOpts).apply(graph); plan.runPhases(PhasePosition.HIGH_LEVEL, graph); diff -r 493e8d932148 -r a63ed5993987 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopTransformations.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopTransformations.java Tue Jun 26 16:50:43 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopTransformations.java Tue Jun 26 16:51:48 2012 +0200 @@ -69,7 +69,7 @@ BeginNode tempBegin = graph.add(new BeginNode()); loop.entryPoint().replaceAtPredecessor(tempBegin); double takenProbability = ifNode.probability(ifNode.blockSuccessorIndex(ifNode.trueSuccessor())); - IfNode newIf = graph.add(new IfNode(ifNode.compare(), duplicateLoop.loop().entryPoint(), loop.entryPoint(), takenProbability)); + IfNode newIf = graph.add(new IfNode(ifNode.compare(), duplicateLoop.loop().entryPoint(), loop.entryPoint(), takenProbability, ifNode.leafGraphId())); tempBegin.setNext(newIf); ifNode.setCompare(graph.unique(ConstantNode.forBoolean(false, graph))); IfNode duplicateIf = duplicateLoop.getDuplicatedNode(ifNode); @@ -97,4 +97,13 @@ inside.duplicate().appendInside(loop); } } + + public static IfNode findUnswitchableIf(LoopEx loop) { + for (IfNode ifNode : loop.whole().nodes().filter(IfNode.class)) { + if (loop.isOutsideLoop(ifNode.compare())) { + return ifNode; + } + } + return null; + } } diff -r 493e8d932148 -r a63ed5993987 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/ConvertUnreachedToGuardPhase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/ConvertUnreachedToGuardPhase.java Tue Jun 26 16:51:48 2012 +0200 @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.compiler.phases; + +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.meta.*; +import com.oracle.graal.compiler.*; +import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.util.*; + + +public class ConvertUnreachedToGuardPhase extends Phase { + private OptimisticOptimizations opt; + + public ConvertUnreachedToGuardPhase(OptimisticOptimizations opt) { + this.opt = opt; + } + + @Override + protected void run(StructuredGraph graph) { + if (!opt.removeNeverExecutedCode()) { + return; + } + for (Node node : graph.getNodes()) { + if (node instanceof IfNode) { + IfNode ifNode = (IfNode) node; + BeginNode insertGuard = null; + BeginNode delete = null; + boolean inverted = false; + if (ifNode.probability(IfNode.TRUE_EDGE) == 0) { + insertGuard = ifNode.falseSuccessor(); + delete = ifNode.trueSuccessor(); + inverted = true; + } else if (ifNode.probability(IfNode.FALSE_EDGE) == 0) { + insertGuard = ifNode.trueSuccessor(); + delete = ifNode.falseSuccessor(); + } + if (insertGuard != null) { + GuardNode guard = graph.unique(new GuardNode(ifNode.compare(), BeginNode.prevBegin(ifNode), DeoptimizationReason.UnreachedCode, DeoptimizationAction.InvalidateReprofile, inverted, ifNode.leafGraphId())); + graph.addBeforeFixed(ifNode, graph.add(new ValueAnchorNode(guard))); + GraphUtil.killCFG(delete); + graph.removeSplit(ifNode, inverted ? IfNode.FALSE_EDGE : IfNode.TRUE_EDGE); + } + } + } + + } + +} diff -r 493e8d932148 -r a63ed5993987 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopFullUnrollPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopFullUnrollPhase.java Tue Jun 26 16:50:43 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopFullUnrollPhase.java Tue Jun 26 16:51:48 2012 +0200 @@ -44,7 +44,7 @@ peeled = false; final LoopsData dataCounted = new LoopsData(graph); dataCounted.detectedCountedLoops(); - for (final LoopEx loop : dataCounted.countedLoops()) { + for (LoopEx loop : dataCounted.countedLoops()) { if (LoopPolicies.shouldFullUnroll(loop)) { Debug.log("FullUnroll %s", loop); LoopTransformations.fullUnroll(loop, runtime); diff -r 493e8d932148 -r a63ed5993987 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue Jun 26 16:50:43 2012 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue Jun 26 16:51:48 2012 +0200 @@ -541,7 +541,7 @@ BeginNode trueSuccessor = createBlockTarget(probability, trueBlock, frameState); BeginNode falseSuccessor = createBlockTarget(1 - probability, falseBlock, frameState); - IfNode ifNode = negate ? new IfNode(condition, falseSuccessor, trueSuccessor, 1 - probability) : new IfNode(condition, trueSuccessor, falseSuccessor, probability); + IfNode ifNode = negate ? new IfNode(condition, falseSuccessor, trueSuccessor, 1 - probability, graphId) : new IfNode(condition, trueSuccessor, falseSuccessor, probability, graphId); append(currentGraph.add(ifNode)); } @@ -653,7 +653,7 @@ } else { BlockPlaceholderNode successor = currentGraph.add(new BlockPlaceholderNode()); DeoptimizeNode deopt = currentGraph.add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, DeoptimizationReason.Unresolved, graphId)); - IfNode ifNode = currentGraph.add(new IfNode(currentGraph.unique(new IsNullNode(object)), successor, deopt, 0)); + IfNode ifNode = currentGraph.add(new IfNode(currentGraph.unique(new IsNullNode(object)), successor, deopt, 0, graphId)); append(ifNode); lastInstr = successor; frameState.ipush(appendConstant(Constant.INT_0)); @@ -757,7 +757,7 @@ private void emitNullCheck(ValueNode receiver) { BlockPlaceholderNode trueSucc = currentGraph.add(new BlockPlaceholderNode()); BlockPlaceholderNode falseSucc = currentGraph.add(new BlockPlaceholderNode()); - IfNode ifNode = currentGraph.add(new IfNode(currentGraph.unique(new IsNullNode(receiver)), trueSucc, falseSucc, 1)); + IfNode ifNode = currentGraph.add(new IfNode(currentGraph.unique(new IsNullNode(receiver)), trueSucc, falseSucc, 1, graphId)); append(ifNode); lastInstr = falseSucc; @@ -776,7 +776,7 @@ private void emitBoundsCheck(ValueNode index, ValueNode length) { BlockPlaceholderNode trueSucc = currentGraph.add(new BlockPlaceholderNode()); BlockPlaceholderNode falseSucc = currentGraph.add(new BlockPlaceholderNode()); - IfNode ifNode = currentGraph.add(new IfNode(currentGraph.unique(new IntegerBelowThanNode(index, length)), trueSucc, falseSucc, 1)); + IfNode ifNode = currentGraph.add(new IfNode(currentGraph.unique(new IntegerBelowThanNode(index, length)), trueSucc, falseSucc, 1, graphId)); append(ifNode); lastInstr = trueSucc; @@ -1405,7 +1405,7 @@ frameState.push(Kind.Object, exception); FixedNode nextDispatch = createTarget(nextBlock, frameState); checkCast.setNext(catchSuccessor); - IfNode ifNode = currentGraph.add(new IfNode(currentGraph.unique(new InstanceOfNode(typeInstruction, (ResolvedJavaType) catchType, exception)), checkCast, nextDispatch, 0.5)); + IfNode ifNode = currentGraph.add(new IfNode(currentGraph.unique(new InstanceOfNode(typeInstruction, (ResolvedJavaType) catchType, exception)), checkCast, nextDispatch, 0.5, graphId)); append(ifNode); } } diff -r 493e8d932148 -r a63ed5993987 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Tue Jun 26 16:50:43 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Tue Jun 26 16:51:48 2012 +0200 @@ -36,6 +36,7 @@ public final class IfNode extends ControlSplitNode implements Simplifiable, LIRLowerable, SplitTypeFeedbackProvider, Negatable { public static final int TRUE_EDGE = 0; public static final int FALSE_EDGE = 1; + private final long leafGraphId; @Input private BooleanNode compare; @@ -48,9 +49,14 @@ compare = x; } - public IfNode(BooleanNode condition, FixedNode trueSuccessor, FixedNode falseSuccessor, double takenProbability) { + public IfNode(BooleanNode condition, FixedNode trueSuccessor, FixedNode falseSuccessor, double takenProbability, long leafGraphId) { super(StampFactory.forVoid(), new BeginNode[] {BeginNode.begin(trueSuccessor), BeginNode.begin(falseSuccessor)}, new double[] {takenProbability, 1 - takenProbability}); this.compare = condition; + this.leafGraphId = leafGraphId; + } + + public long leafGraphId() { + return leafGraphId; } /** @@ -125,6 +131,7 @@ if (!phis.hasNext()) { // empty if construct with no phis: remove it removeEmptyIf(tool); + return; } else { PhiNode singlePhi = phis.next(); if (!phis.hasNext()) { @@ -142,6 +149,7 @@ MaterializeNode materialize = MaterializeNode.create(compare(), graph(), trueValue, falseValue); ((StructuredGraph) graph()).replaceFloating(singlePhi, materialize); removeEmptyIf(tool); + return; } } } diff -r 493e8d932148 -r a63ed5993987 graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/cfg/SimpleCFGTest.java --- a/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/cfg/SimpleCFGTest.java Tue Jun 26 16:50:43 2012 +0200 +++ b/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/cfg/SimpleCFGTest.java Tue Jun 26 16:51:48 2012 +0200 @@ -43,7 +43,7 @@ BeginNode falseBegin = graph.add(new BeginNode()); falseBegin.setNext(falseEnd); - IfNode ifNode = graph.add(new IfNode(null, trueBegin, falseBegin, 0.5)); + IfNode ifNode = graph.add(new IfNode(null, trueBegin, falseBegin, 0.5, graph.graphId())); graph.start().setNext(ifNode); MergeNode merge = graph.add(new MergeNode());