mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-03 00:33:09 +00:00
Be careful when to add implicit kill / dead operands. Don't add them during / post reg-allocation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36458 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
37a21457bf
commit
05350288a6
@ -147,12 +147,18 @@ private: // Intermediate data structures
|
|||||||
SmallVector<unsigned, 4> *PHIVarInfo;
|
SmallVector<unsigned, 4> *PHIVarInfo;
|
||||||
|
|
||||||
/// addRegisterKilled - We have determined MI kills a register. Look for the
|
/// addRegisterKilled - We have determined MI kills a register. Look for the
|
||||||
/// operand that uses it and mark it as IsKill.
|
/// operand that uses it and mark it as IsKill. If AddIfNotFound is true,
|
||||||
void addRegisterKilled(unsigned IncomingReg, MachineInstr *MI);
|
/// 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.
|
/// addRegisterDead - We have determined MI defined a register without a use.
|
||||||
/// Look for the operand that defines it and mark it as IsDead.
|
/// Look for the operand that defines it and mark it as IsDead. If
|
||||||
void addRegisterDead(unsigned IncomingReg, MachineInstr *MI);
|
/// 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 HandlePhysRegUse(unsigned Reg, MachineInstr *MI);
|
||||||
void HandlePhysRegDef(unsigned Reg, MachineInstr *MI);
|
void HandlePhysRegDef(unsigned Reg, MachineInstr *MI);
|
||||||
@ -189,10 +195,11 @@ public:
|
|||||||
|
|
||||||
/// addVirtualRegisterKilled - Add information about the fact that the
|
/// addVirtualRegisterKilled - Add information about the fact that the
|
||||||
/// specified register is killed after being used by the specified
|
/// specified register is killed after being used by the specified
|
||||||
/// instruction.
|
/// instruction. If AddIfNotFound is true, add a implicit operand if it's
|
||||||
///
|
/// not found.
|
||||||
void addVirtualRegisterKilled(unsigned IncomingReg, MachineInstr *MI) {
|
void addVirtualRegisterKilled(unsigned IncomingReg, MachineInstr *MI,
|
||||||
addRegisterKilled(IncomingReg, MI);
|
bool AddIfNotFound = false) {
|
||||||
|
if (addRegisterKilled(IncomingReg, MI, AddIfNotFound))
|
||||||
getVarInfo(IncomingReg).Kills.push_back(MI);
|
getVarInfo(IncomingReg).Kills.push_back(MI);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,10 +232,11 @@ public:
|
|||||||
void removeVirtualRegistersKilled(MachineInstr *MI);
|
void removeVirtualRegistersKilled(MachineInstr *MI);
|
||||||
|
|
||||||
/// addVirtualRegisterDead - Add information about the fact that the specified
|
/// addVirtualRegisterDead - Add information about the fact that the specified
|
||||||
/// register is dead after being used by the specified instruction.
|
/// 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) {
|
void addVirtualRegisterDead(unsigned IncomingReg, MachineInstr *MI,
|
||||||
addRegisterDead(IncomingReg, MI);
|
bool AddIfNotFound = false) {
|
||||||
|
if (addRegisterDead(IncomingReg, MI, AddIfNotFound))
|
||||||
getVarInfo(IncomingReg).Kills.push_back(MI);
|
getVarInfo(IncomingReg).Kills.push_back(MI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,7 +170,8 @@ void LiveVariables::HandleVirtRegUse(VarInfo &VRInfo, MachineBasicBlock *MBB,
|
|||||||
MarkVirtRegAliveInBlock(VRInfo, *PI);
|
MarkVirtRegAliveInBlock(VRInfo, *PI);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LiveVariables::addRegisterKilled(unsigned IncomingReg, MachineInstr *MI) {
|
bool LiveVariables::addRegisterKilled(unsigned IncomingReg, MachineInstr *MI,
|
||||||
|
bool AddIfNotFound) {
|
||||||
bool Found = false;
|
bool Found = false;
|
||||||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
||||||
MachineOperand &MO = MI->getOperand(i);
|
MachineOperand &MO = MI->getOperand(i);
|
||||||
@ -187,17 +188,21 @@ void LiveVariables::addRegisterKilled(unsigned IncomingReg, MachineInstr *MI) {
|
|||||||
RegInfo->isSuperRegister(IncomingReg, Reg) &&
|
RegInfo->isSuperRegister(IncomingReg, Reg) &&
|
||||||
MO.isKill())
|
MO.isKill())
|
||||||
// A super-register kill already exists.
|
// 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
|
// If not found, this means an alias of one of the operand is killed. Add a
|
||||||
// new implicit operand.
|
// new implicit operand if required.
|
||||||
if (!Found)
|
if (!Found && AddIfNotFound) {
|
||||||
MI->addRegOperand(IncomingReg, false/*IsDef*/,true/*IsImp*/,true/*IsKill*/);
|
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;
|
bool Found = false;
|
||||||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
||||||
MachineOperand &MO = MI->getOperand(i);
|
MachineOperand &MO = MI->getOperand(i);
|
||||||
@ -214,15 +219,18 @@ void LiveVariables::addRegisterDead(unsigned IncomingReg, MachineInstr *MI) {
|
|||||||
RegInfo->isSuperRegister(IncomingReg, Reg) &&
|
RegInfo->isSuperRegister(IncomingReg, Reg) &&
|
||||||
MO.isDead())
|
MO.isDead())
|
||||||
// There exists a super-register that's marked dead.
|
// 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
|
// If not found, this means an alias of one of the operand is dead. Add a
|
||||||
// new implicit operand.
|
// new implicit operand.
|
||||||
if (!Found)
|
if (!Found && AddIfNotFound) {
|
||||||
MI->addRegOperand(IncomingReg, true/*IsDef*/,true/*IsImp*/,false/*IsKill*/,
|
MI->addRegOperand(IncomingReg, true/*IsDef*/,true/*IsImp*/,false/*IsKill*/,
|
||||||
true/*IsDead*/);
|
true/*IsDead*/);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return Found;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr *MI) {
|
void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr *MI) {
|
||||||
@ -271,9 +279,9 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI) {
|
|||||||
addRegisterKilled(Reg, LastRef);
|
addRegisterKilled(Reg, LastRef);
|
||||||
else if (PhysRegPartUse[Reg])
|
else if (PhysRegPartUse[Reg])
|
||||||
// Add implicit use / kill to last use of a sub-register.
|
// Add implicit use / kill to last use of a sub-register.
|
||||||
addRegisterKilled(Reg, PhysRegPartUse[Reg]);
|
addRegisterKilled(Reg, PhysRegPartUse[Reg], true);
|
||||||
else
|
else
|
||||||
addRegisterDead(Reg, LastRef);
|
addRegisterDead(Reg, LastRef, true);
|
||||||
}
|
}
|
||||||
PhysRegInfo[Reg] = MI;
|
PhysRegInfo[Reg] = MI;
|
||||||
PhysRegUsed[Reg] = false;
|
PhysRegUsed[Reg] = false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user