/*
* 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.regalloc;
import org.jikesrvm.compilers.opt.ir.BasicBlock;
import org.jikesrvm.compilers.opt.ir.Instruction;
import org.jikesrvm.compilers.opt.ir.Register;
/**
* This class defines a LiveInterval node created by Live Variable analysis
* and used in Linear Scan.
*
* @see LinearScan
*/
public final class LiveIntervalElement {
/**
* register that this live interval is for
*/
private Register register;
/**
* instruction where the live interval begins
* (null if alive at basic block entry)
*/
private Instruction begin;
/**
* instruction where the live interval ends
* (null if alive at basic block exit)
*/
private final Instruction end;
/**
* The basic block holding this live interval element
*/
private BasicBlock bb;
/**
* LiveIntervalElements are linked in a singly-linked list; this is the
* next pointer.
*/
LiveIntervalElement next;
/**
* Use this constructor when the live interval spans a basic block
* boundary.
*
* @param reg The Register whose live interval we are representing
*/
public LiveIntervalElement(Register reg) {
register = reg;
begin = null;
end = null;
}
/**
* Use this constructur when the live interval is within a basic block
*
* @param reg the Register whose live interval we are representing
* @param begin the definition of the register
* @param end the last use of the register
*/
public LiveIntervalElement(Register reg, Instruction begin, Instruction end) {
register = reg;
this.begin = begin;
this.end = end;
}
@Override
public String toString() {
return "Reg: " + register + "\n Begin: " + begin + "\n End: " + end;
}
@Override
public int hashCode() {
return register.hashCode();
}
/*
* Getters and setters for instance fields
*/
public Instruction getBegin() {
return begin;
}
public void setBegin(Instruction begin) {
this.begin = begin;
}
public Instruction getEnd() {
return end;
}
public Register getRegister() {
return register;
}
public void setRegister(Register r) {
register = r;
}
public LiveIntervalElement getNext() {
return next;
}
public void setNext(LiveIntervalElement Next) {
next = Next;
}
public BasicBlock getBasicBlock() {
return bb;
}
public void setBasicBlock(BasicBlock bb) {
this.bb = bb;
}
}