diff options
| author | Roman Divacky <rdivacky@FreeBSD.org> | 2010-05-27 15:15:58 +0000 | 
|---|---|---|
| committer | Roman Divacky <rdivacky@FreeBSD.org> | 2010-05-27 15:15:58 +0000 | 
| commit | abdf259d487163e72081a8cf4991b1617206b41e (patch) | |
| tree | 9fad9a5d5dd8c4ff54af48edad9c8cc26dd5fda1 /lib/CodeGen/MachineInstr.cpp | |
| parent | 59161dfae3225dd9151afbc76ca9074598c0c605 (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/MachineInstr.cpp')
| -rw-r--r-- | lib/CodeGen/MachineInstr.cpp | 90 | 
1 files changed, 73 insertions, 17 deletions
| diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp index 99b5beb136567..e54cd5cf9492c 100644 --- a/lib/CodeGen/MachineInstr.cpp +++ b/lib/CodeGen/MachineInstr.cpp @@ -219,8 +219,12 @@ void MachineOperand::print(raw_ostream &OS, const TargetMachine *TM) const {          OS << "%physreg" << getReg();      } -    if (getSubReg() != 0) -      OS << ':' << getSubReg(); +    if (getSubReg() != 0) { +      if (TM) +        OS << ':' << TM->getRegisterInfo()->getSubRegIndexName(getSubReg()); +      else +        OS << ':' << getSubReg(); +    }      if (isDef() || isKill() || isDead() || isImplicit() || isUndef() ||          isEarlyClobber()) { @@ -781,25 +785,57 @@ int MachineInstr::findRegisterUseOperandIdx(unsigned Reg, bool isKill,    }    return -1;  } -   + +/// readsWritesVirtualRegister - Return a pair of bools (reads, writes) +/// indicating if this instruction reads or writes Reg. This also considers +/// partial defines. +std::pair<bool,bool> +MachineInstr::readsWritesVirtualRegister(unsigned Reg, +                                         SmallVectorImpl<unsigned> *Ops) const { +  bool PartDef = false; // Partial redefine. +  bool FullDef = false; // Full define. +  bool Use = false; + +  for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { +    const MachineOperand &MO = getOperand(i); +    if (!MO.isReg() || MO.getReg() != Reg) +      continue; +    if (Ops) +      Ops->push_back(i); +    if (MO.isUse()) +      Use |= !MO.isUndef(); +    else if (MO.getSubReg()) +      PartDef = true; +    else +      FullDef = true; +  } +  // A partial redefine uses Reg unless there is also a full define. +  return std::make_pair(Use || (PartDef && !FullDef), PartDef || FullDef); +} +  /// findRegisterDefOperandIdx() - Returns the operand index that is a def of  /// the specified register or -1 if it is not found. If isDead is true, defs  /// that are not dead are skipped. If TargetRegisterInfo is non-null, then it  /// also checks if there is a def of a super-register. -int MachineInstr::findRegisterDefOperandIdx(unsigned Reg, bool isDead, -                                          const TargetRegisterInfo *TRI) const { +int +MachineInstr::findRegisterDefOperandIdx(unsigned Reg, bool isDead, bool Overlap, +                                        const TargetRegisterInfo *TRI) const { +  bool isPhys = TargetRegisterInfo::isPhysicalRegister(Reg);    for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {      const MachineOperand &MO = getOperand(i);      if (!MO.isReg() || !MO.isDef())        continue;      unsigned MOReg = MO.getReg(); -    if (MOReg == Reg || -        (TRI && -         TargetRegisterInfo::isPhysicalRegister(MOReg) && -         TargetRegisterInfo::isPhysicalRegister(Reg) && -         TRI->isSubRegister(MOReg, Reg))) -      if (!isDead || MO.isDead()) -        return i; +    bool Found = (MOReg == Reg); +    if (!Found && TRI && isPhys && +        TargetRegisterInfo::isPhysicalRegister(MOReg)) { +      if (Overlap) +        Found = TRI->regsOverlap(MOReg, Reg); +      else +        Found = TRI->isSubRegister(MOReg, Reg); +    } +    if (Found && (!isDead || MO.isDead())) +      return i;    }    return -1;  } @@ -938,6 +974,16 @@ isRegTiedToDefOperand(unsigned UseOpIdx, unsigned *DefOpIdx) const {    return true;  } +/// clearKillInfo - Clears kill flags on all operands. +/// +void MachineInstr::clearKillInfo() { +  for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { +    MachineOperand &MO = getOperand(i); +    if (MO.isReg() && MO.isUse()) +      MO.setIsKill(false); +  } +} +  /// copyKillDeadInfo - Copies kill / dead operand properties from MI.  ///  void MachineInstr::copyKillDeadInfo(const MachineInstr *MI) { @@ -1355,11 +1401,21 @@ bool MachineInstr::addRegisterDead(unsigned IncomingReg,  void MachineInstr::addRegisterDefined(unsigned IncomingReg,                                        const TargetRegisterInfo *RegInfo) { -  MachineOperand *MO = findRegisterDefOperand(IncomingReg, false, RegInfo); -  if (!MO || MO->getSubReg()) -    addOperand(MachineOperand::CreateReg(IncomingReg, -                                         true  /*IsDef*/, -                                         true  /*IsImp*/)); +  if (TargetRegisterInfo::isPhysicalRegister(IncomingReg)) { +    MachineOperand *MO = findRegisterDefOperand(IncomingReg, false, RegInfo); +    if (MO) +      return; +  } else { +    for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { +      const MachineOperand &MO = getOperand(i); +      if (MO.isReg() && MO.getReg() == IncomingReg && MO.isDef() && +          MO.getSubReg() == 0) +        return; +    } +  } +  addOperand(MachineOperand::CreateReg(IncomingReg, +                                       true  /*IsDef*/, +                                       true  /*IsImp*/));  }  unsigned | 
