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);
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);
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) {
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);
}
addRegisterKilled(SubReg, LastRef);
else if (PhysRegPartUse[SubReg])
// Add implicit use / kill to last use of a sub-register.
- addRegisterKilled(SubReg, PhysRegPartUse[SubReg]);
+ addRegisterKilled(SubReg, PhysRegPartUse[SubReg], true);
else
addRegisterDead(SubReg, LastRef);
}
"Cannot have a live-in virtual register!");
HandlePhysRegUse(*I, Ret);
// Add live-out registers as implicit uses.
- Ret->addRegOperand(*I, false, true);
+ if (Ret->findRegisterUseOperandIdx(*I) == -1)
+ Ret->addRegOperand(*I, false, true);
}
}
HandlePhysRegDef(i, 0);
// Clear some states between BB's. These are purely local information.
- for (unsigned i = 0; i != NumRegs; ++i) {
+ for (unsigned i = 0; i != NumRegs; ++i)
PhysRegPartDef[i].clear();
- //PhysRegPartUse[i] = NULL;
- }
std::fill(PhysRegPartUse, PhysRegPartUse + NumRegs, (MachineInstr*)0);
}