diff options
author | Evan Cheng <evan.cheng@apple.com> | 2009-02-06 17:17:30 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2009-02-06 17:17:30 +0000 |
commit | f5a8a3611f4de6e820ddebb1cebb241b7812d8d9 (patch) | |
tree | 832a8134aebec5dbb85db231c42c9dc2727c4ec6 | |
parent | a66b32457d9e316b874d3670157c7dcbf90b53ad (diff) | |
download | external_llvm-f5a8a3611f4de6e820ddebb1cebb241b7812d8d9.zip external_llvm-f5a8a3611f4de6e820ddebb1cebb241b7812d8d9.tar.gz external_llvm-f5a8a3611f4de6e820ddebb1cebb241b7812d8d9.tar.bz2 |
Add TargetInstrInfo::isSafeToMoveRegisterClassDefs. It returns true if it's safe to move an instruction which defines a value in the register class. Replace pre-splitting specific IgnoreRegisterClassBarriers with this new hook.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63936 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Target/TargetInstrInfo.h | 7 | ||||
-rw-r--r-- | lib/CodeGen/PreAllocSplitting.cpp | 5 | ||||
-rw-r--r-- | lib/Target/X86/X86InstrInfo.cpp | 8 | ||||
-rw-r--r-- | lib/Target/X86/X86InstrInfo.h | 7 |
4 files changed, 14 insertions, 13 deletions
diff --git a/include/llvm/Target/TargetInstrInfo.h b/include/llvm/Target/TargetInstrInfo.h index bec37a6..e54ca20 100644 --- a/include/llvm/Target/TargetInstrInfo.h +++ b/include/llvm/Target/TargetInstrInfo.h @@ -427,10 +427,9 @@ public: return false; } - /// IgnoreRegisterClassBarriers - Returns true if pre-register allocation - /// live interval splitting pass should ignore barriers of the specified - /// register class. - virtual bool IgnoreRegisterClassBarriers(const TargetRegisterClass *RC) const{ + /// isSafeToMoveRegClassDefs - Return true if it's safe to move a machine + /// instruction that defines the specified register class. + virtual bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const { return true; } diff --git a/lib/CodeGen/PreAllocSplitting.cpp b/lib/CodeGen/PreAllocSplitting.cpp index dfff87a..ef2cfdb 100644 --- a/lib/CodeGen/PreAllocSplitting.cpp +++ b/lib/CodeGen/PreAllocSplitting.cpp @@ -1128,7 +1128,10 @@ PreAllocSplitting::SplitRegLiveIntervals(const TargetRegisterClass **RCs, // by the current barrier. SmallVector<LiveInterval*, 8> Intervals; for (const TargetRegisterClass **RC = RCs; *RC; ++RC) { - if (TII->IgnoreRegisterClassBarriers(*RC)) + // FIXME: If it's not safe to move any instruction that defines the barrier + // register class, then it means there are some special dependencies which + // codegen is not modelling. Ignore these barriers for now. + if (!TII->isSafeToMoveRegClassDefs(*RC)) continue; std::vector<unsigned> &VRs = MRI->getRegClassVirtRegs(*RC); for (unsigned i = 0, e = VRs.size(); i != e; ++i) { diff --git a/lib/Target/X86/X86InstrInfo.cpp b/lib/Target/X86/X86InstrInfo.cpp index 8e3985f..5778849 100644 --- a/lib/Target/X86/X86InstrInfo.cpp +++ b/lib/Target/X86/X86InstrInfo.cpp @@ -2483,11 +2483,11 @@ ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const { } bool X86InstrInfo:: -IgnoreRegisterClassBarriers(const TargetRegisterClass *RC) const { - // FIXME: Ignore bariers of x87 stack registers for now. We can't +isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const { + // FIXME: Return false for x87 stack register classes 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; + return !(RC == &X86::CCRRegClass || RC == &X86::RFP32RegClass || + RC == &X86::RFP64RegClass || RC == &X86::RFP80RegClass); } const TargetRegisterClass *X86InstrInfo::getPointerRegClass() const { diff --git a/lib/Target/X86/X86InstrInfo.h b/lib/Target/X86/X86InstrInfo.h index 077de56..eba0baf 100644 --- a/lib/Target/X86/X86InstrInfo.h +++ b/lib/Target/X86/X86InstrInfo.h @@ -406,10 +406,9 @@ 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; + /// isSafeToMoveRegClassDefs - Return true if it's safe to move a machine + /// instruction that defines the specified register class. + bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const; const TargetRegisterClass *getPointerRegClass() const; |