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}