/* * This file is part of the Jikes RVM project (http://jikesrvm.org). * * This file is licensed to You under the Eclipse Public License (EPL); * You may not use this file except in compliance with the License. You * may obtain a copy of the License at * * http://www.opensource.org/licenses/eclipse-1.0.php * * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. */ package org.jikesrvm.compilers.opt.depgraph; import static org.jikesrvm.compilers.opt.depgraph.DepGraphConstants.COMPACT; import static org.jikesrvm.compilers.opt.depgraph.DepGraphConstants.REG_TRUE; import org.jikesrvm.compilers.opt.ir.Instruction; import org.jikesrvm.compilers.opt.ir.operand.RegisterOperand; import org.jikesrvm.compilers.opt.util.SpaceEffGraphNode; /** * Dependence graph node: there is one for each instruction in a basic block. */ public class DepGraphNode extends SpaceEffGraphNode { /** * Instruction that this node represents. */ public final Instruction _instr; /** * Constructor. * @param instr the instruction this node represents */ public DepGraphNode(Instruction instr) { _instr = instr; } /** * Get the instruction this node represents. * @return instruction this node represents */ public Instruction instruction() { return _instr; } /** * Returns the string representation of this node. * @return string representation of this node */ @Override public String toString() { return "[" + _instr + "]"; } /** * Add an out edge from this node to the given node. * @param node destination node for the edge * @param type the type of the edge to add */ public void insertOutEdge(DepGraphNode node, int type) { if (COMPACT) { int numTries = 0; // bound to avoid quadratic blowup. for (DepGraphEdge oe = (DepGraphEdge) firstOutEdge(); oe != null && numTries < 4; oe = (DepGraphEdge) oe.getNextOut(), numTries++) { if (oe.toNode() == node) { oe.addDepType(type); return; } } } DepGraphEdge edge = new DepGraphEdge(this, node, type); this.appendOutEdge(edge); node.appendInEdge(edge); } /** * Add an out edge this node to the given node * because of a register true dependence of a given operand. * @param node destination node for the edge * @param op the operand of node that is defined by this edge */ public void insertRegTrueOutEdge(DepGraphNode node, RegisterOperand op) { DepGraphEdge e = new DepGraphEdge(op, this, node, REG_TRUE); this.appendOutEdge(e); node.appendInEdge(e); } }