diff options
Diffstat (limited to 'lib/CodeGen/MachineInstrBundle.cpp')
| -rw-r--r-- | lib/CodeGen/MachineInstrBundle.cpp | 43 | 
1 files changed, 20 insertions, 23 deletions
| diff --git a/lib/CodeGen/MachineInstrBundle.cpp b/lib/CodeGen/MachineInstrBundle.cpp index cd820ee1ac52..3eaf4c5dea0f 100644 --- a/lib/CodeGen/MachineInstrBundle.cpp +++ b/lib/CodeGen/MachineInstrBundle.cpp @@ -293,15 +293,17 @@ MachineOperandIteratorBase::PhysRegInfo  MachineOperandIteratorBase::analyzePhysReg(unsigned Reg,                                             const TargetRegisterInfo *TRI) {    bool AllDefsDead = true; -  PhysRegInfo PRI = {false, false, false, false, false, false}; +  PhysRegInfo PRI = {false, false, false, false, false, false, false};    assert(TargetRegisterInfo::isPhysicalRegister(Reg) &&           "analyzePhysReg not given a physical register!");    for (; isValid(); ++*this) {      MachineOperand &MO = deref(); -    if (MO.isRegMask() && MO.clobbersPhysReg(Reg)) -      PRI.Clobbers = true;    // Regmask clobbers Reg. +    if (MO.isRegMask() && MO.clobbersPhysReg(Reg)) { +      PRI.Clobbered = true; +      continue; +    }      if (!MO.isReg())        continue; @@ -310,33 +312,28 @@ MachineOperandIteratorBase::analyzePhysReg(unsigned Reg,      if (!MOReg || !TargetRegisterInfo::isPhysicalRegister(MOReg))        continue; -    bool IsRegOrSuperReg = MOReg == Reg || TRI->isSubRegister(MOReg, Reg); -    bool IsRegOrOverlapping = MOReg == Reg || TRI->regsOverlap(MOReg, Reg); - -    if (IsRegOrSuperReg && MO.readsReg()) { -      // Reg or a super-reg is read, and perhaps killed also. -      PRI.Reads = true; -      PRI.Kills = MO.isKill(); -    } - -    if (IsRegOrOverlapping && MO.readsReg()) { -      PRI.ReadsOverlap = true;// Reg or an overlapping register is read. -    } - -    if (!MO.isDef()) +    if (!TRI->regsOverlap(MOReg, Reg))        continue; -    if (IsRegOrSuperReg) { -      PRI.Defines = true;     // Reg or a super-register is defined. +    bool Covered = TRI->isSuperRegisterEq(MOReg, Reg); +    if (MO.readsReg()) { +      PRI.Read = true; +      if (Covered) { +        PRI.FullyRead = true; +        if (MO.isKill()) +          PRI.Killed = true; +      } +    } else if (MO.isDef()) { +      PRI.Defined = true; +      if (Covered) +        PRI.FullyDefined = true;        if (!MO.isDead())          AllDefsDead = false;      } -    if (IsRegOrOverlapping) -      PRI.Clobbers = true;    // Reg or an overlapping reg is defined.    } -  if (AllDefsDead && PRI.Defines) -    PRI.DefinesDead = true;   // Reg or super-register was defined and was dead. +  if (AllDefsDead && PRI.FullyDefined) +    PRI.DeadDef = true;    return PRI;  } | 
