diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-02-10 19:23:53 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-02-10 19:23:53 +0000 |
commit | 938200859ec714f59f8f93acceb999e212e9c539 (patch) | |
tree | 30055415a03eb3855cf681e714a5307ba1dfee97 | |
parent | 6ef7da0197735a16aa534e9e2c80709d3d6e8c56 (diff) |
Add a static MachineOperand::clobbersPhysReg().
It can be necessary to detach a register mask pointer from its
MachineOperand. This method is convenient for checking clobbered
physregs on a detached bitmask pointer.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150261 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/CodeGen/MachineOperand.h | 16 | ||||
-rw-r--r-- | lib/CodeGen/InterferenceCache.cpp | 9 |
2 files changed, 14 insertions, 11 deletions
diff --git a/include/llvm/CodeGen/MachineOperand.h b/include/llvm/CodeGen/MachineOperand.h index 59da26c71c..a414b0fc3d 100644 --- a/include/llvm/CodeGen/MachineOperand.h +++ b/include/llvm/CodeGen/MachineOperand.h @@ -441,12 +441,20 @@ public: return Contents.OffsetedInfo.Val.SymbolName; } - /// clobbersPhysReg - Returns true if this RegMask operand clobbers PhysReg. - bool clobbersPhysReg(unsigned PhysReg) const { - assert(isRegMask() && "Wrong MachineOperand accessor"); + /// clobbersPhysReg - Returns true if this RegMask clobbers PhysReg. + /// It is sometimes necessary to detach the register mask pointer from its + /// machine operand. This static method can be used for such detached bit + /// mask pointers. clobbersPhysReg - Returns true if this RegMask operand + /// clobbers PhysReg. + static bool clobbersPhysReg(const uint32_t *RegMask, unsigned PhysReg) { // See TargetRegisterInfo.h. assert(PhysReg < (1u << 30) && "Not a physical register"); - return !(Contents.RegMask[PhysReg / 32] & (1u << PhysReg % 32)); + return !(RegMask[PhysReg / 32] & (1u << PhysReg % 32)); + } + + /// clobbersPhysReg - Returns true if this RegMask operand clobbers PhysReg. + bool clobbersPhysReg(unsigned PhysReg) const { + return clobbersPhysReg(getRegMask(), PhysReg); } /// getRegMask - Returns a bit mask of registers preserved by this RegMask diff --git a/lib/CodeGen/InterferenceCache.cpp b/lib/CodeGen/InterferenceCache.cpp index 74f67c2db0..a8a32f3f1a 100644 --- a/lib/CodeGen/InterferenceCache.cpp +++ b/lib/CodeGen/InterferenceCache.cpp @@ -106,11 +106,6 @@ bool InterferenceCache::Entry::valid(LiveIntervalUnion *LIUArray, return i == e; } -// Test if a register mask clobbers PhysReg. -static inline bool maskClobber(const uint32_t *Mask, unsigned PhysReg) { - return !(Mask[PhysReg/32] & (1u << PhysReg%32)); -} - void InterferenceCache::Entry::update(unsigned MBBNum) { SlotIndex Start, Stop; tie(Start, Stop) = Indexes->getMBBRange(MBBNum); @@ -152,7 +147,7 @@ void InterferenceCache::Entry::update(unsigned MBBNum) { SlotIndex Limit = BI->First.isValid() ? BI->First : Stop; for (unsigned i = 0, e = RegMaskSlots.size(); i != e && RegMaskSlots[i] < Limit; ++i) - if (maskClobber(RegMaskBits[i], PhysReg)) { + if (MachineOperand::clobbersPhysReg(RegMaskBits[i], PhysReg)) { // Register mask i clobbers PhysReg before the LIU interference. BI->First = RegMaskSlots[i]; break; @@ -191,7 +186,7 @@ void InterferenceCache::Entry::update(unsigned MBBNum) { // Also check for register mask interference. SlotIndex Limit = BI->Last.isValid() ? BI->Last : Start; for (unsigned i = RegMaskSlots.size(); i && RegMaskSlots[i-1] > Limit; --i) - if (maskClobber(RegMaskBits[i-1], PhysReg)) { + if (MachineOperand::clobbersPhysReg(RegMaskBits[i-1], PhysReg)) { // Register mask i-1 clobbers PhysReg after the LIU interference. // Model the regmask clobber as a dead def. BI->Last = RegMaskSlots[i-1].getDeadSlot(); |