aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/llvm/CodeGen/LiveVariables.h36
-rw-r--r--lib/CodeGen/LiveVariables.cpp26
2 files changed, 39 insertions, 23 deletions
diff --git a/include/llvm/CodeGen/LiveVariables.h b/include/llvm/CodeGen/LiveVariables.h
index 5b42a71..ebbe610 100644
--- a/include/llvm/CodeGen/LiveVariables.h
+++ b/include/llvm/CodeGen/LiveVariables.h
@@ -147,12 +147,18 @@ private: // Intermediate data structures
SmallVector<unsigned, 4> *PHIVarInfo;
/// addRegisterKilled - We have determined MI kills a register. Look for the
- /// operand that uses it and mark it as IsKill.
- void addRegisterKilled(unsigned IncomingReg, MachineInstr *MI);
+ /// operand that uses it and mark it as IsKill. If AddIfNotFound is true,
+ /// add a implicit operand if it's not found. Returns true if the operand
+ /// exists / is added.
+ bool addRegisterKilled(unsigned IncomingReg, MachineInstr *MI,
+ bool AddIfNotFound = false);
/// addRegisterDead - We have determined MI defined a register without a use.
- /// Look for the operand that defines it and mark it as IsDead.
- void addRegisterDead(unsigned IncomingReg, MachineInstr *MI);
+ /// Look for the operand that defines it and mark it as IsDead. If
+ /// AddIfNotFound is true, add a implicit operand if it's not found. Returns
+ /// true if the operand exists / is added.
+ bool addRegisterDead(unsigned IncomingReg, MachineInstr *MI,
+ bool AddIfNotFound = false);
void HandlePhysRegUse(unsigned Reg, MachineInstr *MI);
void HandlePhysRegDef(unsigned Reg, MachineInstr *MI);
@@ -189,11 +195,12 @@ public:
/// addVirtualRegisterKilled - Add information about the fact that the
/// specified register is killed after being used by the specified
- /// instruction.
- ///
- void addVirtualRegisterKilled(unsigned IncomingReg, MachineInstr *MI) {
- addRegisterKilled(IncomingReg, MI);
- getVarInfo(IncomingReg).Kills.push_back(MI);
+ /// instruction. If AddIfNotFound is true, add a implicit operand if it's
+ /// not found.
+ void addVirtualRegisterKilled(unsigned IncomingReg, MachineInstr *MI,
+ bool AddIfNotFound = false) {
+ if (addRegisterKilled(IncomingReg, MI, AddIfNotFound))
+ getVarInfo(IncomingReg).Kills.push_back(MI);
}
/// removeVirtualRegisterKilled - Remove the specified virtual
@@ -225,11 +232,12 @@ public:
void removeVirtualRegistersKilled(MachineInstr *MI);
/// addVirtualRegisterDead - Add information about the fact that the specified
- /// register is dead after being used by the specified instruction.
- ///
- void addVirtualRegisterDead(unsigned IncomingReg, MachineInstr *MI) {
- addRegisterDead(IncomingReg, MI);
- getVarInfo(IncomingReg).Kills.push_back(MI);
+ /// register is dead after being used by the specified instruction. If
+ /// AddIfNotFound is true, add a implicit operand if it's not found.
+ void addVirtualRegisterDead(unsigned IncomingReg, MachineInstr *MI,
+ bool AddIfNotFound = false) {
+ if (addRegisterDead(IncomingReg, MI, AddIfNotFound))
+ getVarInfo(IncomingReg).Kills.push_back(MI);
}
/// removeVirtualRegisterDead - Remove the specified virtual
diff --git a/lib/CodeGen/LiveVariables.cpp b/lib/CodeGen/LiveVariables.cpp
index a2b1703..fcefe26 100644
--- a/lib/CodeGen/LiveVariables.cpp
+++ b/lib/CodeGen/LiveVariables.cpp
@@ -170,7 +170,8 @@ void LiveVariables::HandleVirtRegUse(VarInfo &VRInfo, MachineBasicBlock *MBB,
MarkVirtRegAliveInBlock(VRInfo, *PI);
}
-void LiveVariables::addRegisterKilled(unsigned IncomingReg, MachineInstr *MI) {
+bool LiveVariables::addRegisterKilled(unsigned IncomingReg, MachineInstr *MI,
+ bool AddIfNotFound) {
bool Found = false;
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
MachineOperand &MO = MI->getOperand(i);
@@ -187,17 +188,21 @@ void LiveVariables::addRegisterKilled(unsigned IncomingReg, MachineInstr *MI) {
RegInfo->isSuperRegister(IncomingReg, Reg) &&
MO.isKill())
// A super-register kill already exists.
- return;
+ return true;
}
}
// If not found, this means an alias of one of the operand is killed. Add a
- // new implicit operand.
- if (!Found)
+ // new implicit operand if required.
+ if (!Found && AddIfNotFound) {
MI->addRegOperand(IncomingReg, false/*IsDef*/,true/*IsImp*/,true/*IsKill*/);
+ return true;
+ }
+ return Found;
}
-void LiveVariables::addRegisterDead(unsigned IncomingReg, MachineInstr *MI) {
+bool LiveVariables::addRegisterDead(unsigned IncomingReg, MachineInstr *MI,
+ bool AddIfNotFound) {
bool Found = false;
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
MachineOperand &MO = MI->getOperand(i);
@@ -214,15 +219,18 @@ void LiveVariables::addRegisterDead(unsigned IncomingReg, MachineInstr *MI) {
RegInfo->isSuperRegister(IncomingReg, Reg) &&
MO.isDead())
// There exists a super-register that's marked dead.
- return;
+ return true;
}
}
// If not found, this means an alias of one of the operand is dead. Add a
// new implicit operand.
- if (!Found)
+ if (!Found && AddIfNotFound) {
MI->addRegOperand(IncomingReg, true/*IsDef*/,true/*IsImp*/,false/*IsKill*/,
true/*IsDead*/);
+ return true;
+ }
+ return Found;
}
void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr *MI) {
@@ -271,9 +279,9 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI) {
addRegisterKilled(Reg, LastRef);
else if (PhysRegPartUse[Reg])
// Add implicit use / kill to last use of a sub-register.
- addRegisterKilled(Reg, PhysRegPartUse[Reg]);
+ addRegisterKilled(Reg, PhysRegPartUse[Reg], true);
else
- addRegisterDead(Reg, LastRef);
+ addRegisterDead(Reg, LastRef, true);
}
PhysRegInfo[Reg] = MI;
PhysRegUsed[Reg] = false;