/*
* 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.ssa;
import org.jikesrvm.compilers.opt.ir.Instruction;
import org.jikesrvm.compilers.opt.ir.operand.ConstantOperand;
import org.jikesrvm.compilers.opt.util.SpaceEffGraphNode;
/**
* This class implements a vertex in the value graph used in global
* value numbering
* ala Alpern, Wegman and Zadeck. See Muchnick p.348 for a nice
* discussion.
*/
final class ValueGraphVertex extends SpaceEffGraphNode {
/** the name of the variable defined by this node */
private final Object name;
/** the name of the operator that does the definition */
private Object label;
/** operand vertices, in order */
private ValueGraphVertex[] targets;
/** integer value number */
private int valueNumber;
/** number of operands needed */
private int arity;
ValueGraphVertex(Object name) {
this.name = name;
}
/**
* Sets up properties of this vertex identically to another vertex.
*
* @param v the vertex to copy the properties from
*/
void copyVertex(ValueGraphVertex v) {
this.label = v.label;
this.valueNumber = v.valueNumber;
this.arity = v.arity;
this.targets = new ValueGraphVertex[v.targets.length];
for (int i = 0; i < targets.length; i++) {
this.targets[i] = v.targets[i];
}
}
/**
* @return whether this vertex represents an incoming parameter
*/
boolean representsParameter() {
return (label instanceof ValueGraphParamLabel);
}
/**
* Set the label for this vertex.
*
* @param label the label (an operator of some type)
* @param arity the number of operands needed
*/
void setLabel(Object label, int arity) {
this.label = label;
this.arity = arity;
targets = new ValueGraphVertex[arity];
}
Object getLabel() {
return label;
}
Object getName() {
return name;
}
int getValueNumber() {
return valueNumber;
}
void setValueNumber(int number) {
valueNumber = number;
}
boolean isConstant() {
return (label instanceof ConstantOperand);
}
// is the def for this node an allocation instruction?
boolean isBornAtAllocation() {
return (label instanceof Instruction);
}
/**
* @param i operand number
* @return the target of the ith operand of this node
*/
public ValueGraphVertex getTarget(int i) {
return targets[i];
}
public void addTarget(ValueGraphVertex target, int pos) {
targets[pos] = target;
}
public int getArity() {
return arity;
}
@Override
public String toString() {
StringBuilder s = new StringBuilder("Vertex: " + name + " " + label);
s.append(" Targets: ");
for (int i = 0; i < arity; i++) {
if (targets[i] == null) {
s.append("null ");
} else {
s.append(targets[i].getName()).append(" ");
}
}
return s.toString();
}
}