aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/MachineInstr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/MachineInstr.cpp')
-rw-r--r--lib/CodeGen/MachineInstr.cpp26
1 files changed, 11 insertions, 15 deletions
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp
index 319059b4bb..595fddda6f 100644
--- a/lib/CodeGen/MachineInstr.cpp
+++ b/lib/CodeGen/MachineInstr.cpp
@@ -782,31 +782,27 @@ 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;
+/// 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
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())
+ return true;
+ 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);
+ // A partial register definition causes a read unless the full register is
+ // also defined.
+ return PartDef && !FullDef;
}
/// findRegisterDefOperandIdx() - Returns the operand index that is a def of