Use MachineInstr::readsWritesVirtualRegister to determine if a register is read.

This correctly handles partial redefines and undef uses.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104322 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen
2010-05-21 16:42:30 +00:00
parent 2afb7505c5
commit 00c53caa33
3 changed files with 34 additions and 58 deletions
+15 -11
View File
@@ -782,27 +782,31 @@ int MachineInstr::findRegisterUseOperandIdx(unsigned Reg, bool isKill,
return -1;
}
/// readsVirtualRegister - Return true if the MachineInstr reads the specified
/// virtual register. Take into account that a partial define is a
/// read-modify-write operation.
bool MachineInstr::readsVirtualRegister(unsigned Reg) const {
bool PartDef = false; // Partial redefine
bool FullDef = false; // Full define
/// 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())
return true;
if (MO.getSubReg())
Use |= !MO.isUndef();
else if (MO.getSubReg())
PartDef = true;
else
FullDef = true;
}
// A partial register definition causes a read unless the full register is
// also defined.
return PartDef && !FullDef;
// 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