Add a static MachineOperand::clobbersPhysReg().
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 10 Feb 2012 19:23:53 +0000 (19:23 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 10 Feb 2012 19:23:53 +0000 (19:23 +0000)
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

include/llvm/CodeGen/MachineOperand.h
lib/CodeGen/InterferenceCache.cpp

index 59da26c71cc858e257bc4ec4a2ff7b2f9697cf87..a414b0fc3d736da7e048d8686b0de7b600f51393 100644 (file)
@@ -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
index 74f67c2db07932c5cc638717574fc7369357c2a7..a8a32f3f1a7ce12c9d790098790b6c918a61f645 100644 (file)
@@ -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();