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 | |
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')
-rw-r--r-- | llvm/lib/CodeGen/MachineInstr.cpp | 22 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp | 8 |
2 files changed, 18 insertions, 12 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. diff --git a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp index 5399a51557b..46ddab0d761 100644 --- a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp @@ -945,12 +945,8 @@ EmitSpecialNode(SDNode *Node, bool IsClone, bool IsCloned, if (InlineAsm::isUseOperandTiedToDef(Flags, DefGroup)) { unsigned DefIdx = GroupIdx[DefGroup] + 1; unsigned UseIdx = GroupIdx.back() + 1; - for (unsigned j = 0; j != NumVals; ++j) { - assert(!MI->getOperand(DefIdx + j).isTied() && - "Def is already tied to another use"); - MI->getOperand(DefIdx + j).setIsTied(); - MI->getOperand(UseIdx + j).setIsTied(); - } + for (unsigned j = 0; j != NumVals; ++j) + MI->tieOperands(DefIdx + j, UseIdx + j); } } break; |