summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/MachineInstr.cpp
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2012-08-31 20:50:53 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2012-08-31 20:50:53 +0000
commit5c8eda0ebc2fb62866bd43fe0d20d6bc992692fc (patch)
treee29c7c6db9d133414aed8d9e9d73fe18231bf038 /llvm/lib/CodeGen/MachineInstr.cpp
parent3224543bf90a7fe52a15052b2e2339cea7d669c1 (diff)
downloadbcm5719-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.cpp22
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.
OpenPOWER on IntegriCloud