For now, don't split live intervals around x87 stack register barriers. FpGET_ST0_80 must be right after a call instruction (and ADJCALLSTACKUP) so we need to find a way to prevent reload of x87 registers between them.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58230 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng
2008-10-27 07:14:50 +00:00
parent 0fd77a579b
commit 23066288fd
6 changed files with 60 additions and 1 deletions

View File

@@ -2411,6 +2411,14 @@ ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
return false;
}
bool X86InstrInfo::
IgnoreRegisterClassBarriers(const TargetRegisterClass *RC) const {
// FIXME: Ignore bariers of x87 stack registers for now. We can't
// allow any loads of these registers before FpGet_ST0_80.
return RC == &X86::CCRRegClass || RC == &X86::RFP32RegClass ||
RC == &X86::RFP64RegClass || RC == &X86::RFP80RegClass;
}
const TargetRegisterClass *X86InstrInfo::getPointerRegClass() const {
const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
if (Subtarget->is64Bit())

View File

@@ -405,6 +405,11 @@ public:
virtual
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
/// IgnoreRegisterClassBarriers - Returns true if pre-register allocation
/// live interval splitting pass should ignore barriers of the specified
/// register class.
bool IgnoreRegisterClassBarriers(const TargetRegisterClass *RC) const;
const TargetRegisterClass *getPointerRegClass() const;
// getBaseOpcodeFor - This function returns the "base" X86 opcode for the

View File

@@ -94,6 +94,10 @@ public:
/// Code Generation virtual methods...
///
/// getCrossCopyRegClass - Returns a legal register class to copy a register
/// in the specified class to or from. Returns NULL if it is possible to copy
/// between a two registers of the specified class.
const TargetRegisterClass *
getCrossCopyRegClass(const TargetRegisterClass *RC) const;