# HG changeset patch # User Lukas Stadler # Date 1329744455 -3600 # Node ID 75dcf829cfdc5e82e1329dd0eabc8c26a7f775b9 # Parent eb2c6d2a0098ccc6367c8b64c1cd66d6970830b2 experimental: "next" successor on all nodes diff -r eb2c6d2a0098 -r 75dcf829cfdc graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Graph.java --- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Graph.java Mon Feb 20 14:25:32 2012 +0100 +++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Graph.java Mon Feb 20 14:27:35 2012 +0100 @@ -176,21 +176,24 @@ @SuppressWarnings("unchecked") public T unique(T node) { assert checkValueNumberable(node); - if (!node.getNodeClass().hasOutgoingEdges()) { - Node cachedNode = cachedNodes.get(new CacheEntry(node)); - if (cachedNode != null && cachedNode.isAlive()) { - return (T) cachedNode; - } else { - Node result = add(node); - cachedNodes.put(new CacheEntry(node), result); - return (T) result; + + for (Node input : node.inputs()) { + if (input != null) { + for (Node usage : input.usages()) { + if (usage != node && node.getNodeClass().valueEqual(node, usage) && node.getNodeClass().edgesEqual(node, usage)) { + return (T) usage; + } + } + return add(node); } + } + Node cachedNode = cachedNodes.get(new CacheEntry(node)); + if (cachedNode != null && cachedNode.isAlive()) { + return (T) cachedNode; } else { - Node duplicate = findDuplicate(node); - if (duplicate != null) { - return (T) duplicate; - } - return add(node); + Node result = add(node); + cachedNodes.put(new CacheEntry(node), result); + return (T) result; } } diff -r eb2c6d2a0098 -r 75dcf829cfdc graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/FixedWithNextNode.java --- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/FixedWithNextNode.java Mon Feb 20 14:25:32 2012 +0100 +++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/FixedWithNextNode.java Mon Feb 20 14:27:35 2012 +0100 @@ -29,15 +29,13 @@ */ public abstract class FixedWithNextNode extends FixedNode { - @Successor private FixedNode next; // the immediate successor of the current node - public FixedNode next() { - return next; + assert scheduledNext() == null || scheduledNext() instanceof FixedNode : "next() cannot be used while the graph is scheduled"; + return (FixedNode) scheduledNext(); } public void setNext(FixedNode x) { - updatePredecessors(next, x); - next = x; + setScheduledNext(x); } public FixedWithNextNode(Stamp stamp) { diff -r eb2c6d2a0098 -r 75dcf829cfdc graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/ScheduledNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/ScheduledNode.java Mon Feb 20 14:27:35 2012 +0100 @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2012, 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.max.graal.nodes; + +import com.oracle.max.graal.graph.*; + +public class ScheduledNode extends Node { + + @Successor private ScheduledNode scheduledNext; // the immediate successor of the current node + + public ScheduledNode scheduledNext() { + return scheduledNext; + } + + public void setScheduledNext(ScheduledNode x) { + updatePredecessors(scheduledNext, x); + scheduledNext = x; + } +} diff -r eb2c6d2a0098 -r 75dcf829cfdc graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/ValueNode.java --- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/ValueNode.java Mon Feb 20 14:25:32 2012 +0100 +++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/ValueNode.java Mon Feb 20 14:27:35 2012 +0100 @@ -24,14 +24,13 @@ import com.oracle.max.cri.ci.*; import com.oracle.max.cri.ri.*; -import com.oracle.max.graal.graph.*; import com.oracle.max.graal.nodes.type.*; /** * This class represents a value within the graph, including local variables, phis, and * all other instructions. */ -public abstract class ValueNode extends Node implements StampProvider { +public abstract class ValueNode extends ScheduledNode implements StampProvider { /** * The kind of this value. This is {@link CiKind#Void} for instructions that produce no value.