diff options
author | Owen Anderson <resistor@mac.com> | 2008-01-24 01:10:07 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2008-01-24 01:10:07 +0000 |
commit | b487e7215c4f70f3d98f8fbc0a11eb119afc1f37 (patch) | |
tree | c707073b206365f8422c7ae4d64d3e02b802c910 /lib/CodeGen/LiveVariables.cpp | |
parent | 3ae054385cfe9f2fcef2d77f26839615b1d3e48b (diff) | |
download | external_llvm-b487e7215c4f70f3d98f8fbc0a11eb119afc1f37.zip external_llvm-b487e7215c4f70f3d98f8fbc0a11eb119afc1f37.tar.gz external_llvm-b487e7215c4f70f3d98f8fbc0a11eb119afc1f37.tar.bz2 |
Move some functionality for adding flags to MachineInstr's into methods on MachineInstr rather than LiveVariables.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46295 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/LiveVariables.cpp')
-rw-r--r-- | lib/CodeGen/LiveVariables.cpp | 120 |
1 files changed, 14 insertions, 106 deletions
diff --git a/lib/CodeGen/LiveVariables.cpp b/lib/CodeGen/LiveVariables.cpp index 79c3192..b39e48d 100644 --- a/lib/CodeGen/LiveVariables.cpp +++ b/lib/CodeGen/LiveVariables.cpp @@ -192,73 +192,6 @@ void LiveVariables::HandleVirtRegUse(unsigned reg, MachineBasicBlock *MBB, MarkVirtRegAliveInBlock(VRInfo, MRI.getVRegDef(reg)->getParent(), *PI); } -bool LiveVariables::addRegisterKilled(unsigned IncomingReg, MachineInstr *MI, - const MRegisterInfo *RegInfo, - bool AddIfNotFound) { - bool Found = false; - for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { - MachineOperand &MO = MI->getOperand(i); - if (MO.isRegister() && MO.isUse()) { - unsigned Reg = MO.getReg(); - if (!Reg) - continue; - if (Reg == IncomingReg) { - MO.setIsKill(); - Found = true; - break; - } else if (MRegisterInfo::isPhysicalRegister(Reg) && - MRegisterInfo::isPhysicalRegister(IncomingReg) && - RegInfo->isSuperRegister(IncomingReg, Reg) && - MO.isKill()) - // A super-register kill already exists. - Found = true; - } - } - - // If not found, this means an alias of one of the operand is killed. Add a - // new implicit operand if required. - if (!Found && AddIfNotFound) { - MI->addOperand(MachineOperand::CreateReg(IncomingReg, false/*IsDef*/, - true/*IsImp*/,true/*IsKill*/)); - return true; - } - return Found; -} - -bool LiveVariables::addRegisterDead(unsigned IncomingReg, MachineInstr *MI, - const MRegisterInfo *RegInfo, - bool AddIfNotFound) { - bool Found = false; - for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { - MachineOperand &MO = MI->getOperand(i); - if (MO.isRegister() && MO.isDef()) { - unsigned Reg = MO.getReg(); - if (!Reg) - continue; - if (Reg == IncomingReg) { - MO.setIsDead(); - Found = true; - break; - } else if (MRegisterInfo::isPhysicalRegister(Reg) && - MRegisterInfo::isPhysicalRegister(IncomingReg) && - RegInfo->isSuperRegister(IncomingReg, Reg) && - MO.isDead()) - // There exists a super-register that's marked dead. - return true; - } - } - - // If not found, this means an alias of one of the operand is dead. Add a - // new implicit operand. - if (!Found && AddIfNotFound) { - MI->addOperand(MachineOperand::CreateReg(IncomingReg, true/*IsDef*/, - true/*IsImp*/,false/*IsKill*/, - true/*IsDead*/)); - return true; - } - return Found; -} - void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr *MI) { // Turn previous partial def's into read/mod/write. for (unsigned i = 0, e = PhysRegPartDef[Reg].size(); i != e; ++i) { @@ -337,7 +270,7 @@ bool LiveVariables::HandlePhysRegKill(unsigned Reg, MachineInstr *RefMI, void LiveVariables::addRegisterKills(unsigned Reg, MachineInstr *MI, SmallSet<unsigned, 4> &SubKills) { if (SubKills.count(Reg) == 0) - addRegisterKilled(Reg, MI, RegInfo, true); + MI->addRegisterKilled(Reg, RegInfo, true); else { for (const unsigned *SubRegs = RegInfo->getImmediateSubRegisters(Reg); unsigned SubReg = *SubRegs; ++SubRegs) @@ -348,7 +281,7 @@ void LiveVariables::addRegisterKills(unsigned Reg, MachineInstr *MI, bool LiveVariables::HandlePhysRegKill(unsigned Reg, MachineInstr *RefMI) { SmallSet<unsigned, 4> SubKills; if (HandlePhysRegKill(Reg, RefMI, SubKills)) { - addRegisterKilled(Reg, RefMI, RegInfo, true); + RefMI->addRegisterKilled(Reg, RegInfo, true); return true; } else { // Some sub-registers are killed by another MI. @@ -365,15 +298,15 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI) { if (PhysRegUsed[Reg]) { if (!HandlePhysRegKill(Reg, LastRef)) { if (PhysRegPartUse[Reg]) - addRegisterKilled(Reg, PhysRegPartUse[Reg], RegInfo, true); + PhysRegPartUse[Reg]->addRegisterKilled(Reg, RegInfo, true); } } else if (PhysRegPartUse[Reg]) // Add implicit use / kill to last partial use. - addRegisterKilled(Reg, PhysRegPartUse[Reg], RegInfo, true); + PhysRegPartUse[Reg]->addRegisterKilled(Reg, RegInfo, true); else if (LastRef != MI) // Defined, but not used. However, watch out for cases where a super-reg // is also defined on the same MI. - addRegisterDead(Reg, LastRef, RegInfo); + LastRef->addRegisterDead(Reg, RegInfo); } for (const unsigned *SubRegs = RegInfo->getSubRegisters(Reg); @@ -382,14 +315,14 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI) { if (PhysRegUsed[SubReg]) { if (!HandlePhysRegKill(SubReg, LastRef)) { if (PhysRegPartUse[SubReg]) - addRegisterKilled(SubReg, PhysRegPartUse[SubReg], RegInfo, true); + PhysRegPartUse[SubReg]->addRegisterKilled(SubReg, RegInfo, true); } } else if (PhysRegPartUse[SubReg]) // Add implicit use / kill to last use of a sub-register. - addRegisterKilled(SubReg, PhysRegPartUse[SubReg], RegInfo, true); + PhysRegPartUse[SubReg]->addRegisterKilled(SubReg, RegInfo, true); else if (LastRef != MI) // This must be a def of the subreg on the same MI. - addRegisterDead(SubReg, LastRef, RegInfo); + LastRef->addRegisterDead(SubReg, RegInfo); } } @@ -565,11 +498,13 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &mf) { for (unsigned j = 0, e2 = VirtRegInfo[i].Kills.size(); j != e2; ++j) { if (VirtRegInfo[i].Kills[j] == MRI.getVRegDef(i + MRegisterInfo::FirstVirtualRegister)) - addRegisterDead(i + MRegisterInfo::FirstVirtualRegister, - VirtRegInfo[i].Kills[j], RegInfo); + VirtRegInfo[i].Kills[j]->addRegisterDead(i + + MRegisterInfo::FirstVirtualRegister, + RegInfo); else - addRegisterKilled(i + MRegisterInfo::FirstVirtualRegister, - VirtRegInfo[i].Kills[j], RegInfo); + VirtRegInfo[i].Kills[j]->addRegisterKilled(i + + MRegisterInfo::FirstVirtualRegister, + RegInfo); } // Check to make sure there are no unreachable blocks in the MC CFG for the @@ -620,33 +555,6 @@ void LiveVariables::instructionChanged(MachineInstr *OldMI, } } -/// transferKillDeadInfo - Similar to instructionChanged except it does not -/// update live variables internal data structures. -void LiveVariables::transferKillDeadInfo(MachineInstr *OldMI, - MachineInstr *NewMI, - const MRegisterInfo *RegInfo) { - // If the instruction defines any virtual registers, update the VarInfo, - // kill and dead information for the instruction. - for (unsigned i = 0, e = OldMI->getNumOperands(); i != e; ++i) { - MachineOperand &MO = OldMI->getOperand(i); - if (MO.isRegister() && MO.getReg() && - MRegisterInfo::isVirtualRegister(MO.getReg())) { - unsigned Reg = MO.getReg(); - if (MO.isDef()) { - if (MO.isDead()) { - MO.setIsDead(false); - addRegisterDead(Reg, NewMI, RegInfo); - } - } - if (MO.isKill()) { - MO.setIsKill(false); - addRegisterKilled(Reg, NewMI, RegInfo); - } - } - } -} - - /// removeVirtualRegistersKilled - Remove all killed info for the specified /// instruction. void LiveVariables::removeVirtualRegistersKilled(MachineInstr *MI) { |