1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00

switch the register iterator to act more like hte LLVM value iterator: dereferencing

it now returns the machineinstr of the use.  To get the operand, use I.getOperand().

Add a new MachineRegisterInfo::replaceRegWith, which is basically like
Value::replaceAllUsesWith.

llvm-svn: 45482
This commit is contained in:
Chris Lattner 2008-01-01 20:36:19 +00:00
parent d2485b2cec
commit 490a9681cb
3 changed files with 43 additions and 11 deletions

View File

@ -70,6 +70,11 @@ public:
} }
static reg_iterator reg_end() { return reg_iterator(0); } static reg_iterator reg_end() { return reg_iterator(0); }
/// replaceRegWith - Replace all instances of FromReg with ToReg in the
/// machine function. This is like llvm-level X->replaceAllUsesWith(Y),
/// except that it also changes any definitions of the register as well.
void replaceRegWith(unsigned FromReg, unsigned ToReg);
/// getRegUseDefListHead - Return the head pointer for the register use/def /// getRegUseDefListHead - Return the head pointer for the register use/def
/// list for the specified virtual or physical register. /// list for the specified virtual or physical register.
MachineOperand *&getRegUseDefListHead(unsigned RegNo) { MachineOperand *&getRegUseDefListHead(unsigned RegNo) {
@ -171,15 +176,13 @@ private:
public: public:
/// reg_iterator - This class provides iterator support for machine /// reg_iterator - This class provides iterator support for machine
/// operands in the function that use or define a specific register. /// operands in the function that use or define a specific register.
class reg_iterator : public forward_iterator<MachineOperand, ptrdiff_t> { class reg_iterator : public forward_iterator<MachineInstr, ptrdiff_t> {
typedef forward_iterator<MachineOperand, ptrdiff_t> super;
MachineOperand *Op; MachineOperand *Op;
reg_iterator(MachineOperand *op) : Op(op) {} reg_iterator(MachineOperand *op) : Op(op) {}
friend class MachineRegisterInfo; friend class MachineRegisterInfo;
public: public:
typedef super::reference reference; typedef forward_iterator<MachineInstr, ptrdiff_t>::reference reference;
typedef super::pointer pointer; typedef forward_iterator<MachineInstr, ptrdiff_t>::pointer pointer;
reg_iterator(const reg_iterator &I) : Op(I.Op) {} reg_iterator(const reg_iterator &I) : Op(I.Op) {}
reg_iterator() : Op(0) {} reg_iterator() : Op(0) {}
@ -204,13 +207,28 @@ public:
reg_iterator tmp = *this; ++*this; return tmp; reg_iterator tmp = *this; ++*this; return tmp;
} }
// Retrieve a reference to the current operand. MachineOperand &getOperand() const {
MachineOperand &operator*() const {
assert(Op && "Cannot dereference end iterator!"); assert(Op && "Cannot dereference end iterator!");
return *Op; return *Op;
} }
MachineOperand *operator->() const { return Op; } /// getOperandNo - Return the operand # of this MachineOperand in its
/// MachineInstr.
unsigned getOperandNo() const {
assert(Op && "Cannot dereference end iterator!");
return Op - &Op->getParent()->getOperand(0);
}
// Retrieve a reference to the current operand.
MachineInstr &operator*() const {
assert(Op && "Cannot dereference end iterator!");
return *Op->getParent();
}
MachineInstr *operator->() const {
assert(Op && "Cannot dereference end iterator!");
return Op->getParent();
}
}; };
}; };

View File

@ -1,4 +1,4 @@
//===-- MachineInstr.cpp --------------------------------------------------===// //===-- lib/CodeGen/MachineInstr.cpp --------------------------------------===//
// //
// The LLVM Compiler Infrastructure // The LLVM Compiler Infrastructure
// //

View File

@ -45,6 +45,20 @@ void MachineRegisterInfo::HandleVRegListReallocation() {
} }
} }
/// replaceRegWith - Replace all instances of FromReg with ToReg in the
/// machine function. This is like llvm-level X->replaceAllUsesWith(Y),
/// except that it also changes any definitions of the register as well.
void MachineRegisterInfo::replaceRegWith(unsigned FromReg, unsigned ToReg) {
assert(FromReg != ToReg && "Cannot replace a reg with itself");
// TODO: This could be more efficient by bulk changing the operands.
for (reg_iterator I = reg_begin(FromReg), E = reg_end(); I != E; ) {
MachineOperand &O = I.getOperand();
++I;
O.setReg(ToReg);
}
}
/// getVRegDef - Return the machine instr that defines the specified virtual /// getVRegDef - Return the machine instr that defines the specified virtual
/// register or null if none is found. This assumes that the code is in SSA /// register or null if none is found. This assumes that the code is in SSA
@ -54,8 +68,8 @@ MachineInstr *MachineRegisterInfo::getVRegDef(unsigned Reg) const {
"Invalid vreg!"); "Invalid vreg!");
for (reg_iterator I = reg_begin(Reg), E = reg_end(); I != E; ++I) { for (reg_iterator I = reg_begin(Reg), E = reg_end(); I != E; ++I) {
// Since we are in SSA form, we can stop at the first definition. // Since we are in SSA form, we can stop at the first definition.
if (I->isDef()) if (I.getOperand().isDef())
return I->getParent(); return &*I;
} }
return 0; return 0;
} }