001/*
002 *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003 *
004 *  This file is licensed to You under the Eclipse Public License (EPL);
005 *  You may not use this file except in compliance with the License. You
006 *  may obtain a copy of the License at
007 *
008 *      http://www.opensource.org/licenses/eclipse-1.0.php
009 *
010 *  See the COPYRIGHT.txt file distributed with this work for information
011 *  regarding copyright ownership.
012 */
013package org.jikesrvm.compilers.opt.ir.operand;
014
015import org.jikesrvm.compilers.opt.ir.Instruction;
016import org.jikesrvm.compilers.opt.ssa.HeapVariable;
017
018/**
019 * Represents a heap variable for instructions in Heap Array SSA form.
020 *
021 * @see Operand
022 * @see HeapVariable
023 */
024public final class HeapOperand<T> extends Operand {
025
026  /**
027   * The heap variable corresponding to this operand.
028   */
029  public final HeapVariable<T> value;
030
031  /**
032   * Return  the heap variable corresponding to this operand.
033   * @return the heap variable corresponding to this operand.
034   */
035  public HeapVariable<T> getHeapVariable() {
036    return value;
037  }
038
039  /**
040   * Return the number of the heap variable corresponding to this
041   * operand.
042   * @return the number of the heap variable corresponding to this
043   * operand.
044   */
045  public int getNumber() {
046    return value.getNumber();
047  }
048
049  /**
050   * Return the type corresponding to the heap variable associated with
051   * this operand.
052   * @return the type corresponding to the heap variable associated with
053   * this operand.
054   */
055  public T getHeapType() {
056    return value.getHeapType();
057  }
058
059  /**
060   * Construct an operand corresponding to a heap variable.
061   * @param   heap the heap variable corresponding to this operand.
062   */
063  public HeapOperand(HeapVariable<T> heap) {
064    value = heap;
065  }
066
067  /**
068   * Construct a new heap operand associated with the same heap variable as
069   * this operand
070   *
071   * @return a new heap operand associated with the same heap variable as
072   * this operand
073   */
074  @Override
075  public HeapOperand<T> copy() {
076    return new HeapOperand<T>(value);
077  }
078
079  /**
080   * Does this operand correspond to the same heap variable as another
081   * heap operand?
082   *
083   * @param op the second operand to compare with
084   * @return {@code true} or {@code false}
085   */
086  @Override
087  public boolean similar(Operand op) {
088    if (!(op instanceof HeapOperand<?>)) {
089      return false;
090    }
091    HeapOperand<?> h = (HeapOperand<?>) op;
092    return (h.value == value);
093  }
094
095  /**
096   * Return a string representation of this operand.
097   * @return a string representation of this operand.
098   */
099  @Override
100  public String toString() {
101    return value.toString();
102  }
103
104  /**
105   * Associate this operand with a given instruction.
106   * @param s the associated instruction
107   */
108  public void setInstruction(Instruction s) {
109    this.instruction = s;
110  }
111
112  /**
113   * Return the instruction associated with this operand.
114   * @return the instruction associated with this operand.
115   */
116  public Instruction getInstruction() {
117    return instruction;
118  }
119}