diff options
| -rw-r--r-- | llvm/lib/CodeGen/LiveRegUnits.cpp | 29 | 
1 files changed, 19 insertions, 10 deletions
diff --git a/llvm/lib/CodeGen/LiveRegUnits.cpp b/llvm/lib/CodeGen/LiveRegUnits.cpp index c9fa40e25d1..5ff27dd1aaf 100644 --- a/llvm/lib/CodeGen/LiveRegUnits.cpp +++ b/llvm/lib/CodeGen/LiveRegUnits.cpp @@ -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;    }  }  | 

