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 */
013 package org.jikesrvm.compilers.opt.regalloc;
014
015 import org.jikesrvm.compilers.opt.ir.BasicBlock;
016 import org.jikesrvm.compilers.opt.ir.Instruction;
017 import org.jikesrvm.compilers.opt.ir.Register;
018
019 /**
020 * This class defines a LiveInterval node created by Live Variable analysis
021 * and used in Linear Scan.
022 *
023 * @see LinearScan
024 */
025 public final class LiveIntervalElement {
026
027 /**
028 * register that this live interval is for
029 */
030 private Register register;
031
032 /**
033 * instruction where the live interval begins
034 * (null if alive at basic block entry)
035 */
036 private Instruction begin;
037
038 /**
039 * instruction where the live interval ends
040 * (null if alive at basic block exit)
041 */
042 private Instruction end;
043
044 /**
045 * The basic block holding this live interval element
046 */
047 private BasicBlock bb;
048
049 /**
050 * LiveIntervalElements are linked in a singly-linked list; this is the
051 * next pointer.
052 */
053 LiveIntervalElement next;
054
055 /**
056 * Use this constructor when the live interval spans a basic block
057 * boundary.
058 *
059 * @param reg The Register whose live interval we are representing
060 */
061 public LiveIntervalElement(Register reg) {
062 register = reg;
063 begin = null;
064 end = null;
065 }
066
067 /**
068 * Use this constructur when the live interval is within a basic block
069 *
070 * @param reg the Register whose live interval we are representing
071 * @param begin the definition of the register
072 * @param end the last use of the register
073 */
074 public LiveIntervalElement(Register reg, Instruction begin, Instruction end) {
075 register = reg;
076 this.begin = begin;
077 this.end = end;
078 }
079
080 public String toString() {
081 return "Reg: " + register + "\n Begin: " + begin + "\n End: " + end;
082 }
083
084 public int hashCode() {
085 return register.hashCode();
086 }
087
088 /*
089 * Getters and setters for instance fields
090 */
091 public Instruction getBegin() { return begin; }
092
093 public void setBegin(Instruction begin) { this.begin = begin; }
094
095 public Instruction getEnd() { return end; }
096
097 public Register getRegister() { return register; }
098
099 public void setRegister(Register r) { register = r; }
100
101 public LiveIntervalElement getNext() { return next; }
102
103 public void setNext(LiveIntervalElement Next) { next = Next; }
104
105 public BasicBlock getBasicBlock() { return bb; }
106
107 public void setBasicBlock(BasicBlock bb) { this.bb = bb; }
108 }