From 05350288a6bc22a294ff7625f244731ef7125f8a Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Thu, 26 Apr 2007 01:40:09 +0000 Subject: [PATCH] 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 --- include/llvm/CodeGen/LiveVariables.h | 36 +++++++++++++++++----------- lib/CodeGen/LiveVariables.cpp | 26 +++++++++++++------- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/include/llvm/CodeGen/LiveVariables.h b/include/llvm/CodeGen/LiveVariables.h index 5b42a713189..ebbe610ed01 100644 --- a/include/llvm/CodeGen/LiveVariables.h +++ b/include/llvm/CodeGen/LiveVariables.h @@ -147,12 +147,18 @@ private: // Intermediate data structures SmallVector *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 a2b1703ce69..fcefe263db2 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; -- 2.34.1