diff options
| author | Chris Lattner <sabre@nondot.org> | 2008-01-01 01:12:31 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2008-01-01 01:12:31 +0000 |
| commit | 62ed6b9ade63bf01717ce5274fa11e93e873d245 (patch) | |
| tree | 9068503f260d6d167ced6218ee4d53599e1ff70a /include/llvm/CodeGen/MachineInstr.h | |
| parent | 264e6fec9f3962cb269031d6d84cee9f896e0286 (diff) | |
Implement automatically updated def/use lists for all MachineInstr register
operands. The lists are currently kept in MachineRegisterInfo, but it does
not yet provide an iterator interface to them.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45477 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/CodeGen/MachineInstr.h')
| -rw-r--r-- | include/llvm/CodeGen/MachineInstr.h | 47 |
1 files changed, 24 insertions, 23 deletions
diff --git a/include/llvm/CodeGen/MachineInstr.h b/include/llvm/CodeGen/MachineInstr.h index fa372f6e16..7c8fe880bb 100644 --- a/include/llvm/CodeGen/MachineInstr.h +++ b/include/llvm/CodeGen/MachineInstr.h @@ -45,6 +45,7 @@ class MachineInstr { // Intrusive list support friend struct ilist_traits<MachineInstr>; + friend struct ilist_traits<MachineBasicBlock>; void setParent(MachineBasicBlock *P) { Parent = P; } public: /// MachineInstr ctor - This constructor creates a dummy MachineInstr with @@ -154,27 +155,14 @@ public: void dump() const; //===--------------------------------------------------------------------===// - // Accessors to add operands when building up machine instructions. - // - void addOperand(const MachineOperand &Op) { - bool isImpReg = Op.isRegister() && Op.isImplicit(); - assert((isImpReg || !OperandsComplete()) && - "Trying to add an operand to a machine instr that is already done!"); - if (isImpReg || NumImplicitOps == 0) {// This is true most of the time. - Operands.push_back(Op); - Operands.back().ParentMI = this; - } else { - // Insert a real operand before any implicit ones. - unsigned OpNo = Operands.size()-NumImplicitOps; - Operands.insert(Operands.begin()+OpNo, Op); - Operands[OpNo].ParentMI = this; - } - } - - //===--------------------------------------------------------------------===// - // Accessors used to modify instructions in place. - // + // Accessors used to build up machine instructions. + /// addOperand - Add the specified operand to the instruction. If it is an + /// implicit operand, it is added to the end of the operand list. If it is + /// an explicit operand it is added at the end of the explicit operand list + /// (before the first implicit operand). + void addOperand(const MachineOperand &Op); + /// setInstrDescriptor - Replace the instruction descriptor (thus opcode) of /// the current instruction with a new one. /// @@ -183,14 +171,27 @@ public: /// RemoveOperand - Erase an operand from an instruction, leaving it with one /// fewer operand than it started with. /// - void RemoveOperand(unsigned i) { - Operands.erase(Operands.begin()+i); - } + void RemoveOperand(unsigned i); + private: + /// getRegInfo - If this instruction is embedded into a MachineFunction, + /// return the MachineRegisterInfo object for the current function, otherwise + /// return null. + MachineRegisterInfo *getRegInfo(); /// addImplicitDefUseOperands - Add all implicit def and use operands to /// this instruction. void addImplicitDefUseOperands(); + + /// RemoveRegOperandsFromUseLists - Unlink all of the register operands in + /// this instruction from their respective use lists. This requires that the + /// operands already be on their use lists. + void RemoveRegOperandsFromUseLists(); + + /// AddRegOperandsToUseLists - Add all of the register operands in + /// this instruction from their respective use lists. This requires that the + /// operands not be on their use lists yet. + void AddRegOperandsToUseLists(MachineRegisterInfo &RegInfo); }; //===----------------------------------------------------------------------===// |
