diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-08-31 20:50:53 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-08-31 20:50:53 +0000 |
commit | 5c8eda0ebc2fb62866bd43fe0d20d6bc992692fc (patch) | |
tree | e29c7c6db9d133414aed8d9e9d73fe18231bf038 /llvm/lib/CodeGen/MachineInstr.cpp | |
parent | 3224543bf90a7fe52a15052b2e2339cea7d669c1 (diff) | |
download | bcm5719-llvm-5c8eda0ebc2fb62866bd43fe0d20d6bc992692fc.tar.gz bcm5719-llvm-5c8eda0ebc2fb62866bd43fe0d20d6bc992692fc.zip |
Add MachineInstr::tieOperands, remove setIsTied().
Manage tied operands entirely internally to MachineInstr. This makes it
possible to change the representation of tied operands, as I will do
shortly.
The constraint that tied uses and defs must be in the same order was too
restrictive.
llvm-svn: 163021
Diffstat (limited to 'llvm/lib/CodeGen/MachineInstr.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineInstr.cpp | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp index ae205f6d106..5a395fddeed 100644 --- a/llvm/lib/CodeGen/MachineInstr.cpp +++ b/llvm/lib/CodeGen/MachineInstr.cpp @@ -728,12 +728,8 @@ void MachineInstr::addOperand(const MachineOperand &Op) { // Set the IsTied bit if MC indicates this use is tied to a def. if (Operands[OpNo].isUse()) { int DefIdx = MCID->getOperandConstraint(OpNo, MCOI::TIED_TO); - if (DefIdx != -1) { - MachineOperand &DefMO = getOperand(DefIdx); - assert(DefMO.isDef() && "Use tied to operand that isn't a def"); - DefMO.IsTied = true; - Operands[OpNo].IsTied = true; - } + if (DefIdx != -1) + tieOperands(DefIdx, OpNo); } // If the register operand is flagged as early, mark the operand as such. if (MCID->getOperandConstraint(OpNo, MCOI::EARLY_CLOBBER) != -1) @@ -1140,6 +1136,20 @@ int MachineInstr::findFirstPredOperandIdx() const { return -1; } +/// Mark operands at DefIdx and UseIdx as tied to each other. +void MachineInstr::tieOperands(unsigned DefIdx, unsigned UseIdx) { + assert(DefIdx < UseIdx && "Tied defs must precede the use"); + MachineOperand &DefMO = getOperand(DefIdx); + MachineOperand &UseMO = getOperand(UseIdx); + assert(DefMO.isDef() && "DefIdx must be a def operand"); + assert(UseMO.isUse() && "UseIdx must be a use operand"); + assert(!DefMO.isTied() && "Def is already tied to another use"); + assert(!UseMO.isTied() && "Use is already tied to another def"); + + DefMO.IsTied = true; + UseMO.IsTied = true; +} + /// Given the index of a tied register operand, find the operand it is tied to. /// Defs are tied to uses and vice versa. Returns the index of the tied operand /// which must exist. |