Mercurial > hg > graal-jvmci-8
diff graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Node.java @ 2874:d90bf514d647
Renamed packages.
author | Thomas Wuerthinger <thomas@wuerthinger.net> |
---|---|
date | Wed, 08 Jun 2011 08:59:54 +0200 |
parents | graal/com.oracle.max.graal.graph/src/com/oracle/graal/graph/Node.java@0341b6424579 |
children | 3570f1f7903e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Node.java Wed Jun 08 08:59:54 2011 +0200 @@ -0,0 +1,180 @@ +/* + * Copyright (c) 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.max.graal.graph; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public abstract class Node { + + public static final Node Null = null; + public static final int DeletedID = -1; + + final Graph graph; + private int id; + final NodeArray inputs; + final NodeArray successors; + final ArrayList<Node> usages; + final ArrayList<Node> predecessors; + final ArrayList<Integer> predecessorsIndex; + + public Node(int inputCount, int successorCount, Graph graph) { + assert graph != null; + this.graph = graph; + this.id = graph.register(this); + this.inputs = new NodeArray(this, inputCount); + this.successors = new NodeArray(this, successorCount); + this.predecessors = new ArrayList<Node>(); + this.usages = new ArrayList<Node>(); + this.predecessorsIndex = new ArrayList<Integer>(); + } + + public List<Node> predecessors() { + return Collections.unmodifiableList(predecessors); + } + + public List<Integer> predecessorsIndex() { + return Collections.unmodifiableList(predecessorsIndex); + } + + public List<Node> usages() { + return Collections.unmodifiableList(usages); + } + + public NodeArray inputs() { + return inputs; + } + + public NodeArray successors() { + return successors; + } + + public int id() { + return id; + } + + public Graph graph() { + return graph; + } + + public <T extends Op> T lookup(Class<T> clazz) { + return null; + } + + public String shortName() { + return getClass().getSimpleName(); + } + + public Node replace(Node other) { + assert !isDeleted() && (other == null || !other.isDeleted()); + assert other == null || other.graph == graph; + for (Node usage : usages) { + usage.inputs.replaceFirstOccurrence(this, other); + } + int z = 0; + for (Node predecessor : predecessors) { + int predIndex = predecessorsIndex.get(z); + predecessor.successors.nodes[predIndex] = other; + ++z; + } + if (other != null) { + other.usages.addAll(usages); + other.predecessors.addAll(predecessors); + other.predecessorsIndex.addAll(predecessorsIndex); + } + usages.clear(); + predecessors.clear(); + predecessorsIndex.clear(); + delete(); + return other; + } + + public boolean isDeleted() { + return id == DeletedID; + } + + public void delete() { + assert !isDeleted(); + assert usages.size() == 0 && predecessors.size() == 0 : "id: " + id + ", usages: " + usages.size() + ", predecessors: " + predecessors().size(); + assert predecessorsIndex.size() == 0; + for (int i = 0; i < inputs.size(); ++i) { + inputs.set(i, Null); + } + for (int i = 0; i < successors.size(); ++i) { + successors.set(i, Null); + } + assert predecessors().size() == 0 && usages().size() == 0; + // make sure its not connected. pred usages + graph.unregister(this); + id = DeletedID; + assert isDeleted(); + } + + public Node copy() { + return copy(graph); + } + + /** + * + * @param into + * @return + */ + public abstract Node copy(Graph into); + + /** + * + * @return + */ + protected int inputCount() { + return 0; + } + + /** + * + * @return + */ + protected int successorCount() { + return 0; + } + + /** + * Provides a {@link Map} of properties of this node for use in debugging (e.g., to view in the ideal graph + * visualizer). Subclasses overriding this method should add to the map returned by their superclass. + */ + public Map<Object, Object> getDebugProperties() { + Map<Object, Object> map = new HashMap<Object, Object>(); + map.put("inputCount", inputCount()); + map.put("usageCount", usages.size()); + map.put("successorCount", successorCount()); + map.put("predecessorCount", predecessors.size()); + return map; + } + + @Override + public String toString() { + return this.getClass().getSimpleName() + "-" + this.id(); + } +}