Mark the x86 fp stack registers as "reserved". This tells LiveVariables

and the RegisterScavenger not to expect traditional liveness 
techniques are applicable to these registers, since we don't fully
modify the effects of push and pop after stackification.

llvm-svn: 61179
This commit is contained in:
Dan Gohman 2008-12-18 01:05:09 +00:00
parent 12d031b716
commit 49c44fa014
1 changed files with 14 additions and 0 deletions

View File

@ -263,16 +263,30 @@ X86RegisterInfo::getCalleeSavedRegClasses(const MachineFunction *MF) const {
BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const { BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
BitVector Reserved(getNumRegs()); BitVector Reserved(getNumRegs());
// Set the stack-pointer register and its aliases as reserved.
Reserved.set(X86::RSP); Reserved.set(X86::RSP);
Reserved.set(X86::ESP); Reserved.set(X86::ESP);
Reserved.set(X86::SP); Reserved.set(X86::SP);
Reserved.set(X86::SPL); Reserved.set(X86::SPL);
// Set the frame-pointer register and its aliases as reserved if needed.
if (hasFP(MF)) { if (hasFP(MF)) {
Reserved.set(X86::RBP); Reserved.set(X86::RBP);
Reserved.set(X86::EBP); Reserved.set(X86::EBP);
Reserved.set(X86::BP); Reserved.set(X86::BP);
Reserved.set(X86::BPL); Reserved.set(X86::BPL);
} }
// Mark the x87 stack registers as reserved, since they don't
// behave normally with respect to liveness. We don't fully
// model the effects of x87 stack pushes and pops after
// stackification.
Reserved.set(X86::ST0);
Reserved.set(X86::ST1);
Reserved.set(X86::ST2);
Reserved.set(X86::ST3);
Reserved.set(X86::ST4);
Reserved.set(X86::ST5);
Reserved.set(X86::ST6);
Reserved.set(X86::ST7);
return Reserved; return Reserved;
} }