Make MachineRegisterInfo::getVRegDef more efficient by aiming the keep the def of the vreg at the start of the list, so the list doesn't need to be traversed.

llvm-svn: 45483
This commit is contained in:
Chris Lattner 2008-01-01 21:08:22 +00:00
parent 0cb9dd7aa2
commit caaf8aae4d
1 changed files with 10 additions and 4 deletions

View File

@ -42,17 +42,23 @@ void MachineOperand::AddRegOperandToRegInfo(MachineRegisterInfo *RegInfo) {
} }
// Otherwise, add this operand to the head of the registers use/def list. // Otherwise, add this operand to the head of the registers use/def list.
MachineOperand *&Head = RegInfo->getRegUseDefListHead(getReg()); MachineOperand **Head = &RegInfo->getRegUseDefListHead(getReg());
Contents.Reg.Next = Head; // For SSA values, we prefer to keep the definition at the start of the list.
// we do this by skipping over the definition if it is at the head of the
// list.
if (*Head && (*Head)->isDef())
Head = &(*Head)->Contents.Reg.Next;
Contents.Reg.Next = *Head;
if (Contents.Reg.Next) { if (Contents.Reg.Next) {
assert(getReg() == Contents.Reg.Next->getReg() && assert(getReg() == Contents.Reg.Next->getReg() &&
"Different regs on the same list!"); "Different regs on the same list!");
Contents.Reg.Next->Contents.Reg.Prev = &Contents.Reg.Next; Contents.Reg.Next->Contents.Reg.Prev = &Contents.Reg.Next;
} }
Contents.Reg.Prev = &Head; Contents.Reg.Prev = Head;
Head = this; *Head = this;
} }
void MachineOperand::setReg(unsigned Reg) { void MachineOperand::setReg(unsigned Reg) {