# HG changeset patch # User Gilles Duboscq # Date 1339856012 -7200 # Node ID 6c3a5ccec483f7491106f46637df1b034bbd5686 # Parent 23a7a21e5f12afb81e5a2e501cd3507068ad334e Merge AnchorNode and ValueAnchorNode diff -r 23a7a21e5f12 -r 6c3a5ccec483 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/InliningUtil.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/InliningUtil.java Fri Jun 15 15:48:44 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/InliningUtil.java Sat Jun 16 16:13:32 2012 +0200 @@ -190,7 +190,7 @@ ReadHubNode objectClass = graph.add(new ReadHubNode(receiver)); IsTypeNode isTypeNode = graph.unique(new IsTypeNode(objectClass, type)); FixedGuardNode guard = graph.add(new FixedGuardNode(isTypeNode, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile, invoke.leafGraphId())); - AnchorNode anchor = graph.add(new AnchorNode()); + ValueAnchorNode anchor = graph.add(new ValueAnchorNode()); assert invoke.predecessor() != null; ValueNode anchoredReceiver = createAnchoredReceiver(graph, anchor, type, receiver); diff -r 23a7a21e5f12 -r 6c3a5ccec483 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AnchorNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AnchorNode.java Fri Jun 15 15:48:44 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2009, 2011, 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.nodes; - -import com.oracle.graal.nodes.spi.*; -import com.oracle.graal.nodes.type.*; - -/** - * The {@code AnchorNode} can be used a lower bound for a guard. It can also be used as an upper bound if no other FixedNode can be used for that purpose. - * The guards that should be kept above this node need to be added to the {@link #dependencies()} collection. - */ -public final class AnchorNode extends FixedWithNextNode implements LIRLowerable, Canonicalizable { - - public AnchorNode() { - super(StampFactory.dependency()); - } - - @Override - public ValueNode canonical(CanonicalizerTool tool) { - if (this.usages().size() == 0 && dependencies().isEmpty()) { - return null; - } - return this; - } - - @Override - public void generate(LIRGeneratorTool gen) { - // Currently, there is nothing to emit since anchors are only a structural element with no execution semantics. - } -} diff -r 23a7a21e5f12 -r 6c3a5ccec483 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java Fri Jun 15 15:48:44 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java Sat Jun 16 16:13:32 2012 +0200 @@ -26,6 +26,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.cri.*; import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -92,8 +93,7 @@ @Override public void lower(CiLoweringTool tool) { - AnchorNode newAnchor = graph().add(new AnchorNode()); - newAnchor.dependencies().add(tool.createGuard(condition, deoptReason, action, negated, leafGraphId)); + ValueAnchorNode newAnchor = graph().add(new ValueAnchorNode(tool.createGuard(condition, deoptReason, action, negated, leafGraphId))); ((StructuredGraph) graph()).replaceFixedWithFixed(this, newAnchor); } diff -r 23a7a21e5f12 -r 6c3a5ccec483 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerArithmeticNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerArithmeticNode.java Fri Jun 15 15:48:44 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerArithmeticNode.java Sat Jun 16 16:13:32 2012 +0200 @@ -24,7 +24,6 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; -import com.oracle.graal.graph.iterators.*; import com.oracle.graal.nodes.*; diff -r 23a7a21e5f12 -r 6c3a5ccec483 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java Fri Jun 15 15:48:44 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java Sat Jun 16 16:13:32 2012 +0200 @@ -60,12 +60,14 @@ @Override public ValueNode canonical(CanonicalizerTool tool) { if (this.predecessor() instanceof ValueAnchorNode) { - // transfer values and remove ValueAnchorNode previousAnchor = (ValueAnchorNode) this.predecessor(); - for (ValueNode node : dependencies().nonNull().distinct()) { - previousAnchor.addAnchoredNode(node); + if (previousAnchor.usages().isEmpty()) { // avoid creating cycles + // transfer values and remove + for (ValueNode node : dependencies().nonNull().distinct()) { + previousAnchor.addAnchoredNode(node); + } + return previousAnchor; } - return null; } for (Node node : dependencies().nonNull().and(isNotA(BeginNode.class))) { if (node instanceof ConstantNode) { @@ -83,6 +85,9 @@ } return this; // still necessary } - return null; // no node which require an anchor found + if (usages().isEmpty()) { + return null; // no node which require an anchor found + } + return this; } }