Author: lattner Date: Tue Jan 1 14:36:19 2008 New Revision: 45482 URL: http://llvm.org/viewvc/llvm-project?rev=45482&view=rev Log: 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. Modified: llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h llvm/trunk/lib/CodeGen/MachineInstr.cpp llvm/trunk/lib/CodeGen/MachineRegisterInfo.cpp Modified: llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h?rev=45482&r1=45481&r2=45482&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h (original) +++ llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h Tue Jan 1 14:36:19 2008 @@ -70,6 +70,11 @@ } 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 /// list for the specified virtual or physical register. MachineOperand *&getRegUseDefListHead(unsigned RegNo) { @@ -171,15 +176,13 @@ public: /// reg_iterator - This class provides iterator support for machine /// operands in the function that use or define a specific register. - class reg_iterator : public forward_iterator<MachineOperand, ptrdiff_t> { - typedef forward_iterator<MachineOperand, ptrdiff_t> super; - + class reg_iterator : public forward_iterator<MachineInstr, ptrdiff_t> { MachineOperand *Op; reg_iterator(MachineOperand *op) : Op(op) {} friend class MachineRegisterInfo; public: - typedef super::reference reference; - typedef super::pointer pointer; + typedef forward_iterator<MachineInstr, ptrdiff_t>::reference reference; + typedef forward_iterator<MachineInstr, ptrdiff_t>::pointer pointer; reg_iterator(const reg_iterator &I) : Op(I.Op) {} reg_iterator() : Op(0) {} @@ -204,13 +207,28 @@ reg_iterator tmp = *this; ++*this; return tmp; } - // Retrieve a reference to the current operand. - MachineOperand &operator*() const { + MachineOperand &getOperand() const { assert(Op && "Cannot dereference end iterator!"); 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(); + } }; }; Modified: llvm/trunk/lib/CodeGen/MachineInstr.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineInstr.cpp?rev=45482&r1=45481&r2=45482&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/MachineInstr.cpp (original) +++ llvm/trunk/lib/CodeGen/MachineInstr.cpp Tue Jan 1 14:36:19 2008 @@ -1,4 +1,4 @@ -//===-- MachineInstr.cpp --------------------------------------------------===// +//===-- lib/CodeGen/MachineInstr.cpp --------------------------------------===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/CodeGen/MachineRegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineRegisterInfo.cpp?rev=45482&r1=45481&r2=45482&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/MachineRegisterInfo.cpp (original) +++ llvm/trunk/lib/CodeGen/MachineRegisterInfo.cpp Tue Jan 1 14:36:19 2008 @@ -45,6 +45,20 @@ } } +/// 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 /// register or null if none is found. This assumes that the code is in SSA @@ -54,8 +68,8 @@ "Invalid vreg!"); 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. - if (I->isDef()) - return I->getParent(); + if (I.getOperand().isDef()) + return &*I; } return 0; } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits