[llvm] r192623 - LiveRegUnits::removeRegsInMask safety.

Andrew Trick atrick at apple.com
Mon Oct 14 13:45:19 PDT 2013


Author: atrick
Date: Mon Oct 14 15:45:19 2013
New Revision: 192623

URL: http://llvm.org/viewvc/llvm-project?rev=192623&view=rev
Log:
LiveRegUnits::removeRegsInMask safety.

Clobbering is exclusive not inclusive on register units.
For liveness, we need to consider all the preserved registers.
e.g. A regmask that clobbers YMM0 may preserve XMM0.
Units are only clobbered when all super-registers are clobbered.

Modified:
    llvm/trunk/lib/CodeGen/LiveRegUnits.cpp

Modified: llvm/trunk/lib/CodeGen/LiveRegUnits.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveRegUnits.cpp?rev=192623&r1=192622&r2=192623&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/LiveRegUnits.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveRegUnits.cpp Mon Oct 14 15:45:19 2013
@@ -17,21 +17,30 @@
 #include "llvm/CodeGen/MachineInstrBundle.h"
 using namespace llvm;
 
+/// Return true if the given MachineOperand clobbers the given register unit.
+/// A register unit is only clobbered if all its super-registers are clobbered.
+static bool operClobbersUnit(const MachineOperand *MO, unsigned Unit,
+                             const MCRegisterInfo *MCRI) {
+  for (MCRegUnitRootIterator RI(Unit, MCRI); RI.isValid(); ++RI) {
+    for (MCSuperRegIterator SI(*RI, MCRI, true); SI.isValid(); ++SI) {
+      if (!MO->clobbersPhysReg(*SI))
+        return false;
+    }
+  }
+  return true;
+}
+
 /// We assume the high bits of a physical super register are not preserved
 /// unless the instruction has an implicit-use operand reading the
 /// super-register or a register unit for the upper bits is available.
 void LiveRegUnits::removeRegsInMask(const MachineOperand &Op,
                                     const MCRegisterInfo &MCRI) {
-  const uint32_t *Mask = Op.getRegMask();
-  unsigned Bit = 0;
-  for (unsigned R = 0; R < MCRI.getNumRegs(); ++R) {
-    if ((*Mask & (1u << Bit)) == 0)
-      removeReg(R, MCRI);
-    ++Bit;
-    if (Bit >= 32) {
-      Bit = 0;
-      ++Mask;
-    }
+  SparseSet<unsigned>::iterator LUI = LiveUnits.begin();
+  while (LUI != LiveUnits.end()) {
+    if (operClobbersUnit(&Op, *LUI, &MCRI))
+      LUI = LiveUnits.erase(LUI);
+    else
+      ++LUI;
   }
 }
 





More information about the llvm-commits mailing list