[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.85 - 1.86 --- Log message: Replace std::set with SmallPtrSet. --- Diffs of the changes: (+5 -3) LiveVariables.cpp |8 +--- 1 files changed, 5 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.85 llvm/lib/CodeGen/LiveVariables.cpp:1.86 --- llvm/lib/CodeGen/LiveVariables.cpp:1.85 Tue Jun 26 16:03:35 2007 +++ llvm/lib/CodeGen/LiveVariables.cpp Wed Jun 27 00:23:00 2007 @@ -32,6 +32,7 @@ #include llvm/Target/TargetInstrInfo.h #include llvm/Target/TargetMachine.h #include llvm/ADT/DepthFirstIterator.h +#include llvm/ADT/SmallPtrSet.h #include llvm/ADT/STLExtras.h #include llvm/Config/alloca.h #include algorithm @@ -424,9 +425,10 @@ // nodes, which are treated as a special case). // MachineBasicBlock *Entry = MF-begin(); - std::setMachineBasicBlock* Visited; - for (df_ext_iteratorMachineBasicBlock* DFI = df_ext_begin(Entry, Visited), - E = df_ext_end(Entry, Visited); DFI != E; ++DFI) { + SmallPtrSetMachineBasicBlock*,16 Visited; + for (df_ext_iteratorMachineBasicBlock*, SmallPtrSetMachineBasicBlock*,16 + DFI = df_ext_begin(Entry, Visited), E = df_ext_end(Entry, Visited); + DFI != E; ++DFI) { MachineBasicBlock *MBB = *DFI; // Mark live-in registers as live-in. ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.83 - 1.84 --- Log message: When marking a register as being implicitly defined, make sure to clear its partial use info as well. --- Diffs of the changes: (+2 -0) LiveVariables.cpp |2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.83 llvm/lib/CodeGen/LiveVariables.cpp:1.84 --- llvm/lib/CodeGen/LiveVariables.cpp:1.83 Tue May 8 14:00:00 2007 +++ llvm/lib/CodeGen/LiveVariables.cpp Mon May 14 15:39:18 2007 @@ -314,6 +314,7 @@ } PhysRegInfo[SubReg] = MI; PhysRegUsed[SubReg] = false; +PhysRegPartUse[SubReg] = NULL; } if (MI) @@ -328,6 +329,7 @@ MI-addRegOperand(SuperReg, true/*IsDef*/,true/*IsImp*/); PhysRegInfo[SuperReg] = MI; PhysRegUsed[SuperReg] = false; +PhysRegPartUse[SuperReg] = NULL; } else { // Remember this partial def. PhysRegPartDef[SuperReg].push_back(MI); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.82 - 1.83 --- Log message: Eliminate MarkVirtRegAliveInBlock recursion. --- Diffs of the changes: (+17 -4) LiveVariables.cpp | 21 + 1 files changed, 17 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.82 llvm/lib/CodeGen/LiveVariables.cpp:1.83 --- llvm/lib/CodeGen/LiveVariables.cpp:1.82 Wed May 2 20:11:53 2007 +++ llvm/lib/CodeGen/LiveVariables.cpp Tue May 8 14:00:00 2007 @@ -112,7 +112,8 @@ } void LiveVariables::MarkVirtRegAliveInBlock(VarInfo VRInfo, -MachineBasicBlock *MBB) { +MachineBasicBlock *MBB, +std::vectorMachineBasicBlock* WorkList) { unsigned BBNum = MBB-getNumber(); // Check to see if this basic block is one of the killing blocks. If so, @@ -131,11 +132,23 @@ // Mark the variable known alive in this bb VRInfo.AliveBlocks[BBNum] = true; - for (MachineBasicBlock::const_pred_iterator PI = MBB-pred_begin(), - E = MBB-pred_end(); PI != E; ++PI) -MarkVirtRegAliveInBlock(VRInfo, *PI); + for (MachineBasicBlock::const_pred_reverse_iterator PI = MBB-pred_rbegin(), + E = MBB-pred_rend(); PI != E; ++PI) +WorkList.push_back(*PI); } +void LiveVariables::MarkVirtRegAliveInBlock(VarInfo VRInfo, +MachineBasicBlock *MBB) { + std::vectorMachineBasicBlock* WorkList; + MarkVirtRegAliveInBlock(VRInfo, MBB, WorkList); + while (!WorkList.empty()) { +MachineBasicBlock *Pred = WorkList.back(); +WorkList.pop_back(); +MarkVirtRegAliveInBlock(VRInfo, Pred, WorkList); + } +} + + void LiveVariables::HandleVirtRegUse(VarInfo VRInfo, MachineBasicBlock *MBB, MachineInstr *MI) { assert(VRInfo.DefInst Register use before def!); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.74 - 1.75 --- Log message: Data structure change to improve compile time (especially in debug mode). --- Diffs of the changes: (+23 -12) LiveVariables.cpp | 35 +++ 1 files changed, 23 insertions(+), 12 deletions(-) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.74 llvm/lib/CodeGen/LiveVariables.cpp:1.75 --- llvm/lib/CodeGen/LiveVariables.cpp:1.74 Wed Apr 25 02:30:23 2007 +++ llvm/lib/CodeGen/LiveVariables.cpp Wed Apr 25 14:34:00 2007 @@ -321,10 +321,15 @@ ReservedRegisters = RegInfo-getReservedRegs(mf); - PhysRegInfo.resize(RegInfo-getNumRegs(), (MachineInstr*)NULL); - PhysRegUsed.resize(RegInfo-getNumRegs()); - PhysRegPartDef.resize(RegInfo-getNumRegs()); - PhysRegPartUse.resize(RegInfo-getNumRegs(), (MachineInstr*)NULL); + unsigned NumRegs = RegInfo-getNumRegs(); + PhysRegInfo = new MachineInstr*[NumRegs]; + PhysRegUsed = new bool[NumRegs]; + PhysRegPartUse = new MachineInstr*[NumRegs]; + PhysRegPartDef = new SmallVectorMachineInstr*,4[NumRegs]; + PHIVarInfo = new SmallVectorunsigned, 4[MF-getNumBlockIDs()]; + std::fill(PhysRegInfo, PhysRegInfo + NumRegs, (MachineInstr*)0); + std::fill(PhysRegUsed, PhysRegUsed + NumRegs, false); + std::fill(PhysRegPartUse, PhysRegPartUse + NumRegs, (MachineInstr*)0); /// Get some space for a respectable number of registers... VirtRegInfo.resize(64); @@ -399,10 +404,10 @@ // bottom of this basic block. We check all of our successor blocks to see // if they have PHI nodes, and if so, we simulate an assignment at the end // of the current block. -if (!PHIVarInfo[MBB].empty()) { - std::vectorunsigned VarInfoVec = PHIVarInfo[MBB]; +if (!PHIVarInfo[MBB-getNumber()].empty()) { + SmallVectorunsigned, 4 VarInfoVec = PHIVarInfo[MBB-getNumber()]; - for (std::vectorunsigned::iterator I = VarInfoVec.begin(), + for (SmallVectorunsigned, 4::iterator I = VarInfoVec.begin(), E = VarInfoVec.end(); I != E; ++I) { VarInfo VRInfo = getVarInfo(*I); assert(VRInfo.DefInst Register use before def (or no def)!); @@ -428,15 +433,16 @@ // Loop over PhysRegInfo, killing any registers that are available at the // end of the basic block. This also resets the PhysRegInfo map. -for (unsigned i = 0, e = RegInfo-getNumRegs(); i != e; ++i) +for (unsigned i = 0; i != NumRegs; ++i) if (PhysRegInfo[i]) HandlePhysRegDef(i, 0); // Clear some states between BB's. These are purely local information. -for (unsigned i = 0, e = RegInfo-getNumRegs(); i != e; ++i) { +for (unsigned i = 0; i != NumRegs; ++i) { PhysRegPartDef[i].clear(); - PhysRegPartUse[i] = NULL; + //PhysRegPartUse[i] = NULL; } +std::fill(PhysRegPartUse, PhysRegPartUse + NumRegs, (MachineInstr*)0); } // Convert and transfer the dead / killed information we have gathered into @@ -460,7 +466,12 @@ assert(Visited.count(*i) != 0 unreachable basic block found); #endif - PHIVarInfo.clear(); + delete[] PhysRegInfo; + delete[] PhysRegUsed; + delete[] PhysRegPartUse; + delete[] PhysRegPartDef; + delete[] PHIVarInfo; + return false; } @@ -543,6 +554,6 @@ for (MachineBasicBlock::const_iterator BBI = I-begin(), BBE = I-end(); BBI != BBE BBI-getOpcode() == TargetInstrInfo::PHI; ++BBI) for (unsigned i = 1, e = BBI-getNumOperands(); i != e; i += 2) -PHIVarInfo[BBI-getOperand(i + 1).getMachineBasicBlock()]. +PHIVarInfo[BBI-getOperand(i + 1).getMachineBasicBlock()-getNumber()]. push_back(BBI-getOperand(i).getReg()); } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.75 - 1.76 --- Log message: Clean up. --- Diffs of the changes: (+1 -3) LiveVariables.cpp |4 +--- 1 files changed, 1 insertion(+), 3 deletions(-) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.75 llvm/lib/CodeGen/LiveVariables.cpp:1.76 --- llvm/lib/CodeGen/LiveVariables.cpp:1.75 Wed Apr 25 14:34:00 2007 +++ llvm/lib/CodeGen/LiveVariables.cpp Wed Apr 25 16:34:08 2007 @@ -438,10 +438,8 @@ 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); } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.76 - 1.77 --- Log message: Be careful when to add implicit kill / dead operands. Don't add them during / post reg-allocation. --- Diffs of the changes: (+17 -9) LiveVariables.cpp | 26 +- 1 files changed, 17 insertions(+), 9 deletions(-) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.76 llvm/lib/CodeGen/LiveVariables.cpp:1.77 --- llvm/lib/CodeGen/LiveVariables.cpp:1.76 Wed Apr 25 16:34:08 2007 +++ llvm/lib/CodeGen/LiveVariables.cpp Wed Apr 25 20:40:09 2007 @@ -170,7 +170,8 @@ 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 @@ 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 @@ 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 @@ 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; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.71 - 1.72 --- Log message: Keep track of number of uses within the function per virtual register. --- Diffs of the changes: (+1 -0) LiveVariables.cpp |1 + 1 files changed, 1 insertion(+) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.71 llvm/lib/CodeGen/LiveVariables.cpp:1.72 --- llvm/lib/CodeGen/LiveVariables.cpp:1.71 Sat Mar 17 04:29:54 2007 +++ llvm/lib/CodeGen/LiveVariables.cpp Tue Apr 17 15:22:11 2007 @@ -141,6 +141,7 @@ unsigned BBNum = MBB-getNumber(); VRInfo.UsedBlocks[BBNum] = true; + VRInfo.NumUses++; // Check to see if this basic block is already a kill block... if (!VRInfo.Kills.empty() VRInfo.Kills.back()-getParent() == MBB) { ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.70 - 1.71 --- Log message: Track the BB's where each virtual register is used. --- Diffs of the changes: (+22 -15) LiveVariables.cpp | 37 ++--- 1 files changed, 22 insertions(+), 15 deletions(-) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.70 llvm/lib/CodeGen/LiveVariables.cpp:1.71 --- llvm/lib/CodeGen/LiveVariables.cpp:1.70 Fri Mar 9 03:48:56 2007 +++ llvm/lib/CodeGen/LiveVariables.cpp Sat Mar 17 04:29:54 2007 @@ -48,6 +48,9 @@ cerrAlive in blocks: ; for (unsigned i = 0, e = AliveBlocks.size(); i != e; ++i) if (AliveBlocks[i]) cerr i , ; + cerrUsed in blocks: ; + for (unsigned i = 0, e = UsedBlocks.size(); i != e; ++i) +if (UsedBlocks[i]) cerr i , ; cerr \n Killed by:; if (Kills.empty()) cerr No instructions.\n; @@ -68,7 +71,10 @@ else VirtRegInfo.resize(2*VirtRegInfo.size()); } - return VirtRegInfo[RegIdx]; + VarInfo VI = VirtRegInfo[RegIdx]; + VI.AliveBlocks.resize(MF-getNumBlockIDs()); + VI.UsedBlocks.resize(MF-getNumBlockIDs()); + return VI; } bool LiveVariables::KillsRegister(MachineInstr *MI, unsigned Reg) const { @@ -117,9 +123,6 @@ if (MBB == VRInfo.DefInst-getParent()) return; // Terminate recursion - if (VRInfo.AliveBlocks.size() = BBNum) -VRInfo.AliveBlocks.resize(BBNum+1); // Make space... - if (VRInfo.AliveBlocks[BBNum]) return; // We already know the block is live @@ -135,6 +138,10 @@ MachineInstr *MI) { assert(VRInfo.DefInst Register use before def!); + unsigned BBNum = MBB-getNumber(); + + VRInfo.UsedBlocks[BBNum] = true; + // Check to see if this basic block is already a kill block... if (!VRInfo.Kills.empty() VRInfo.Kills.back()-getParent() == MBB) { // Yes, this register is killed in this basic block already. Increase the @@ -152,11 +159,10 @@ Should have kill for defblock!); // Add a new kill entry for this basic block. - unsigned BBNum = MBB-getNumber(); // If this virtual register is already marked as alive in this basic block, // that means it is alive in at least one of the successor block, it's not // a kill. - if (VRInfo.AliveBlocks.size() = BBNum || !VRInfo.AliveBlocks[BBNum]) + if (!VRInfo.AliveBlocks[BBNum]) VRInfo.Kills.push_back(MI); // Update all dominating blocks to mark them known live. @@ -220,12 +226,13 @@ } } -bool LiveVariables::runOnMachineFunction(MachineFunction MF) { - const TargetInstrInfo TII = *MF.getTarget().getInstrInfo(); - RegInfo = MF.getTarget().getRegisterInfo(); +bool LiveVariables::runOnMachineFunction(MachineFunction mf) { + MF = mf; + const TargetInstrInfo TII = *MF-getTarget().getInstrInfo(); + RegInfo = MF-getTarget().getRegisterInfo(); assert(RegInfo Target doesn't have register information?); - ReservedRegisters = RegInfo-getReservedRegs(MF); + ReservedRegisters = RegInfo-getReservedRegs(mf); // PhysRegInfo - Keep track of which instruction was the last use of a // physical register. This is a purely local property, because all physical @@ -239,14 +246,14 @@ /// Get some space for a respectable number of registers... VirtRegInfo.resize(64); - analyzePHINodes(MF); + analyzePHINodes(mf); // Calculate live variable information in depth first order on the CFG of the // function. This guarantees that we will see the definition of a virtual // register before its uses due to dominance properties of SSA (except for PHI // nodes, which are treated as a special case). // - MachineBasicBlock *Entry = MF.begin(); + MachineBasicBlock *Entry = MF-begin(); std::setMachineBasicBlock* Visited; for (df_ext_iteratorMachineBasicBlock* DFI = df_ext_begin(Entry, Visited), E = df_ext_end(Entry, Visited); DFI != E; ++DFI) { @@ -326,8 +333,8 @@ // it as using all of the live-out values in the function. if (!MBB-empty() TII.isReturn(MBB-back().getOpcode())) { MachineInstr *Ret = MBB-back(); - for (MachineFunction::liveout_iterator I = MF.liveout_begin(), - E = MF.liveout_end(); I != E; ++I) { + for (MachineFunction::liveout_iterator I = MF-liveout_begin(), + E = MF-liveout_end(); I != E; ++I) { assert(MRegisterInfo::isPhysicalRegister(*I) Cannot have a live-in virtual register!); HandlePhysRegUse(*I, Ret); @@ -360,7 +367,7 @@ // function. If so, it is due to a bug in the instruction selector or some // other part of the code generator if this happens. #ifndef NDEBUG - for(MachineFunction::iterator i = MF.begin(), e = MF.end(); i != e; ++i) + for(MachineFunction::iterator i = MF-begin(), e = MF-end(); i != e; ++i) assert(Visited.count(*i) != 0 unreachable basic block found); #endif ___ llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.69 - 1.70 --- Log message: If a virtual register is already marked alive in this block, that means it is alive in one of the successor block. Do not add it to the kill list. --- Diffs of the changes: (+6 -1) LiveVariables.cpp |7 ++- 1 files changed, 6 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.69 llvm/lib/CodeGen/LiveVariables.cpp:1.70 --- llvm/lib/CodeGen/LiveVariables.cpp:1.69 Fri Mar 9 00:02:17 2007 +++ llvm/lib/CodeGen/LiveVariables.cpp Fri Mar 9 03:48:56 2007 @@ -152,7 +152,12 @@ Should have kill for defblock!); // Add a new kill entry for this basic block. - VRInfo.Kills.push_back(MI); + unsigned BBNum = MBB-getNumber(); + // If this virtual register is already marked as alive in this basic block, + // that means it is alive in at least one of the successor block, it's not + // a kill. + if (VRInfo.AliveBlocks.size() = BBNum || !VRInfo.AliveBlocks[BBNum]) +VRInfo.Kills.push_back(MI); // Update all dominating blocks to mark them known live. for (MachineBasicBlock::const_pred_iterator PI = MBB-pred_begin(), ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.65 - 1.66 --- Log message: - Use MRegister::regsOverlap(). - Allow LiveVariables to track liveness of more registers. --- Diffs of the changes: (+8 -28) LiveVariables.cpp | 36 1 files changed, 8 insertions(+), 28 deletions(-) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.65 llvm/lib/CodeGen/LiveVariables.cpp:1.66 --- llvm/lib/CodeGen/LiveVariables.cpp:1.65 Mon Feb 12 19:30:55 2007 +++ llvm/lib/CodeGen/LiveVariables.cpp Sat Feb 17 05:09:47 2007 @@ -71,31 +71,11 @@ return VirtRegInfo[RegIdx]; } -/// registerOverlap - Returns true if register 1 is equal to register 2 -/// or if register 1 is equal to any of alias of register 2. -static bool registerOverlap(unsigned Reg1, unsigned Reg2, - const MRegisterInfo *RegInfo) { - bool isVirt1 = MRegisterInfo::isVirtualRegister(Reg1); - bool isVirt2 = MRegisterInfo::isVirtualRegister(Reg2); - if (isVirt1 != isVirt2) -return false; - if (Reg1 == Reg2) -return true; - else if (isVirt1) -return false; - for (const unsigned *AliasSet = RegInfo-getAliasSet(Reg2); - unsigned Alias = *AliasSet; ++AliasSet) { -if (Reg1 == Alias) - return true; - } - return false; -} - bool LiveVariables::KillsRegister(MachineInstr *MI, unsigned Reg) const { for (unsigned i = 0, e = MI-getNumOperands(); i != e; ++i) { MachineOperand MO = MI-getOperand(i); if (MO.isReg() MO.isKill()) { - if (registerOverlap(Reg, MO.getReg(), RegInfo)) + if (RegInfo-regsOverlap(Reg, MO.getReg())) return true; } } @@ -106,7 +86,7 @@ for (unsigned i = 0, e = MI-getNumOperands(); i != e; ++i) { MachineOperand MO = MI-getOperand(i); if (MO.isReg() MO.isDead()) - if (registerOverlap(Reg, MO.getReg(), RegInfo)) + if (RegInfo-regsOverlap(Reg, MO.getReg())) return true; } return false; @@ -116,7 +96,7 @@ for (unsigned i = 0, e = MI-getNumOperands(); i != e; ++i) { MachineOperand MO = MI-getOperand(i); if (MO.isReg() MO.isDef()) { - if (registerOverlap(Reg, MO.getReg(), RegInfo)) + if (RegInfo-regsOverlap(Reg, MO.getReg())) return true; } } @@ -240,7 +220,7 @@ RegInfo = MF.getTarget().getRegisterInfo(); assert(RegInfo Target doesn't have register information?); - AllocatablePhysicalRegisters = RegInfo-getAllocatableSet(MF); + ReservedRegisters = RegInfo-getReservedRegs(MF); // PhysRegInfo - Keep track of which instruction was the last use of a // physical register. This is a purely local property, because all physical @@ -267,8 +247,8 @@ E = df_ext_end(Entry, Visited); DFI != E; ++DFI) { MachineBasicBlock *MBB = *DFI; - // Mark live-in registers as live-in. -for (MachineBasicBlock::livein_iterator II = MBB-livein_begin(), +// Mark live-in registers as live-in. +for (MachineBasicBlock::const_livein_iterator II = MBB-livein_begin(), EE = MBB-livein_end(); II != EE; ++II) { assert(MRegisterInfo::isPhysicalRegister(*II) Cannot have a live-in virtual register!); @@ -295,7 +275,7 @@ if (MRegisterInfo::isVirtualRegister(MO.getReg())){ HandleVirtRegUse(getVarInfo(MO.getReg()), MBB, MI); } else if (MRegisterInfo::isPhysicalRegister(MO.getReg()) - AllocatablePhysicalRegisters[MO.getReg()]) { + !ReservedRegisters[MO.getReg()]) { HandlePhysRegUse(MO.getReg(), MI); } } @@ -313,7 +293,7 @@ // Defaults to dead VRInfo.Kills.push_back(MI); } else if (MRegisterInfo::isPhysicalRegister(MO.getReg()) - AllocatablePhysicalRegisters[MO.getReg()]) { + !ReservedRegisters[MO.getReg()]) { HandlePhysRegDef(MO.getReg(), MI); } } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.62 - 1.63 --- Log message: Do away with kill / dead maps. Move kill / dead info onto MI's. --- Diffs of the changes: (+107 -81) LiveVariables.cpp | 188 ++ 1 files changed, 107 insertions(+), 81 deletions(-) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.62 llvm/lib/CodeGen/LiveVariables.cpp:1.63 --- llvm/lib/CodeGen/LiveVariables.cpp:1.62 Fri Nov 10 02:38:19 2006 +++ llvm/lib/CodeGen/LiveVariables.cpp Wed Nov 15 14:51:59 2006 @@ -72,24 +72,56 @@ return VirtRegInfo[RegIdx]; } +/// registerOverlap - Returns true if register 1 is equal to register 2 +/// or if register 1 is equal to any of alias of register 2. +static bool registerOverlap(unsigned Reg1, unsigned Reg2, + const MRegisterInfo *RegInfo) { + bool isVirt1 = MRegisterInfo::isVirtualRegister(Reg1); + bool isVirt2 = MRegisterInfo::isVirtualRegister(Reg2); + if (isVirt1 != isVirt2) +return false; + if (Reg1 == Reg2) +return true; + else if (isVirt1) +return false; + for (const unsigned *AliasSet = RegInfo-getAliasSet(Reg2); + unsigned Alias = *AliasSet; ++AliasSet) { +if (Reg1 == Alias) + return true; + } + return false; +} + bool LiveVariables::KillsRegister(MachineInstr *MI, unsigned Reg) const { - std::mapMachineInstr*, std::vectorunsigned ::const_iterator I = - RegistersKilled.find(MI); - if (I == RegistersKilled.end()) return false; - - // Do a binary search, as these lists can grow pretty big, particularly for - // call instructions on targets with lots of call-clobbered registers. - return std::binary_search(I-second.begin(), I-second.end(), Reg); + for (unsigned i = 0, e = MI-getNumOperands(); i != e; ++i) { +MachineOperand MO = MI-getOperand(i); +if (MO.isReg() MO.isKill()) { + if (registerOverlap(Reg, MO.getReg(), RegInfo)) +return true; +} + } + return false; } bool LiveVariables::RegisterDefIsDead(MachineInstr *MI, unsigned Reg) const { - std::mapMachineInstr*, std::vectorunsigned ::const_iterator I = - RegistersDead.find(MI); - if (I == RegistersDead.end()) return false; - - // Do a binary search, as these lists can grow pretty big, particularly for - // call instructions on targets with lots of call-clobbered registers. - return std::binary_search(I-second.begin(), I-second.end(), Reg); + for (unsigned i = 0, e = MI-getNumOperands(); i != e; ++i) { +MachineOperand MO = MI-getOperand(i); +if (MO.isReg() MO.isDead()) + if (registerOverlap(Reg, MO.getReg(), RegInfo)) +return true; + } + return false; +} + +bool LiveVariables::ModifiesRegister(MachineInstr *MI, unsigned Reg) const { + for (unsigned i = 0, e = MI-getNumOperands(); i != e; ++i) { +MachineOperand MO = MI-getOperand(i); +if (MO.isReg() MO.isDef()) { + if (registerOverlap(Reg, MO.getReg(), RegInfo)) +return true; +} + } + return false; } void LiveVariables::MarkVirtRegAliveInBlock(VarInfo VRInfo, @@ -149,6 +181,26 @@ MarkVirtRegAliveInBlock(VRInfo, *PI); } +void LiveVariables::addRegisterKilled(unsigned IncomingReg, MachineInstr *MI) { + for (unsigned i = 0, e = MI-getNumOperands(); i != e; ++i) { +MachineOperand MO = MI-getOperand(i); +if (MO.isReg() MO.isUse() MO.getReg() == IncomingReg) { + MO.setIsKill(); + break; +} + } +} + +void LiveVariables::addRegisterDead(unsigned IncomingReg, MachineInstr *MI) { + for (unsigned i = 0, e = MI-getNumOperands(); i != e; ++i) { +MachineOperand MO = MI-getOperand(i); +if (MO.isReg() MO.isDef() MO.getReg() == IncomingReg) { + MO.setIsDead(); + break; +} + } +} + void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr *MI) { PhysRegInfo[Reg] = MI; PhysRegUsed[Reg] = true; @@ -164,9 +216,9 @@ // Does this kill a previous version of this register? if (MachineInstr *LastUse = PhysRegInfo[Reg]) { if (PhysRegUsed[Reg]) - RegistersKilled[LastUse].push_back(Reg); + addRegisterKilled(Reg, LastUse); else - RegistersDead[LastUse].push_back(Reg); + addRegisterDead(Reg, LastUse); } PhysRegInfo[Reg] = MI; PhysRegUsed[Reg] = false; @@ -175,9 +227,9 @@ unsigned Alias = *AliasSet; ++AliasSet) { if (MachineInstr *LastUse = PhysRegInfo[Alias]) { if (PhysRegUsed[Alias]) -RegistersKilled[LastUse].push_back(Alias); +addRegisterKilled(Alias, LastUse); else -RegistersDead[LastUse].push_back(Alias); +addRegisterDead(Alias, LastUse); } PhysRegInfo[Alias] = MI; PhysRegUsed[Alias] = false; @@ -286,7 +338,7 @@ } } -// Finally, if the last block in the function is a return, make sure to mark +// Finally, if the last instruction in the block is a return, make sure to mark // it as using all of the
[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.59 - 1.60 --- Log message: Fix for PR929: http://llvm.org/PR929 . The PHI nodes were being gone through for each instruction in a successor block for every block...resulting in some O(N^k) algorithm which wasn't very good for performance. Calculating this information up front and keeping it in a map made it much faster. --- Diffs of the changes: (+26 -21) LiveVariables.cpp | 47 ++- 1 files changed, 26 insertions(+), 21 deletions(-) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.59 llvm/lib/CodeGen/LiveVariables.cpp:1.60 --- llvm/lib/CodeGen/LiveVariables.cpp:1.59 Tue Sep 5 15:19:27 2006 +++ llvm/lib/CodeGen/LiveVariables.cpp Tue Oct 3 02:20:20 2006 @@ -92,7 +92,6 @@ return std::binary_search(I-second.begin(), I-second.end(), Reg); } - void LiveVariables::MarkVirtRegAliveInBlock(VarInfo VRInfo, MachineBasicBlock *MBB) { unsigned BBNum = MBB-getNumber(); @@ -212,6 +211,8 @@ HandlePhysRegDef(I-first, 0); } + analyzePHINodes(MF); + // Calculate live variable information in depth first order on the CFG of the // function. This guarantees that we will see the definition of a virtual // register before its uses due to dominance properties of SSA (except for PHI @@ -288,26 +289,16 @@ // bottom of this basic block. We check all of our successor blocks to see // if they have PHI nodes, and if so, we simulate an assignment at the end // of the current block. -for (MachineBasicBlock::succ_iterator SI = MBB-succ_begin(), - E = MBB-succ_end(); SI != E; ++SI) { - MachineBasicBlock *Succ = *SI; - - // PHI nodes are guaranteed to be at the top of the block... - for (MachineBasicBlock::iterator MI = Succ-begin(), ME = Succ-end(); - MI != ME MI-getOpcode() == TargetInstrInfo::PHI; ++MI) { -for (unsigned i = 1; ; i += 2) { - assert(MI-getNumOperands() i+1 - Didn't find an entry for our predecessor??); - if (MI-getOperand(i+1).getMachineBasicBlock() == MBB) { -MachineOperand MO = MI-getOperand(i); -VarInfo VRInfo = getVarInfo(MO.getReg()); -assert(VRInfo.DefInst Register use before def (or no def)!); +if (!PHIVarInfo[MBB].empty()) { + std::vectorunsigned VarInfoVec = PHIVarInfo[MBB]; -// Only mark it alive only in the block we are representing. -MarkVirtRegAliveInBlock(VRInfo, MBB); -break; // Found the PHI entry for this block. - } -} + for (std::vectorunsigned::iterator I = VarInfoVec.begin(), + E = VarInfoVec.end(); I != E; ++I) { +VarInfo VRInfo = getVarInfo(*I); +assert(VRInfo.DefInst Register use before def (or no def)!); + +// Only mark it alive only in the block we are representing. +MarkVirtRegAliveInBlock(VRInfo, MBB); } } @@ -362,6 +353,7 @@ assert(Visited.count(*i) != 0 unreachable basic block found); #endif + PHIVarInfo.clear(); return false; } @@ -450,4 +442,17 @@ RegistersDead.erase(I); } - +/// analyzePHINodes - Gather information about the PHI nodes in here. In +/// particular, we want to map the variable information of a virtual +/// register which is used in a PHI node. We map that to the BB the vreg is +/// coming from. +/// +void LiveVariables::analyzePHINodes(const MachineFunction Fn) { + for (MachineFunction::const_iterator I = Fn.begin(), E = Fn.end(); + I != E; ++I) +for (MachineBasicBlock::const_iterator BBI = I-begin(), BBE = I-end(); + BBI != BBE BBI-getOpcode() == TargetInstrInfo::PHI; ++BBI) + for (unsigned i = 1, e = BBI-getNumOperands(); i != e; i += 2) +PHIVarInfo[BBI-getOperand(i + 1).getMachineBasicBlock()]. + push_back(BBI-getOperand(i).getReg()); +} ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp MachineInstr.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.58 - 1.59 MachineInstr.cpp updated: 1.124 - 1.125 --- Log message: Only call isUse/isDef on register operands --- Diffs of the changes: (+7 -13) LiveVariables.cpp |4 ++-- MachineInstr.cpp | 16 +--- 2 files changed, 7 insertions(+), 13 deletions(-) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.58 llvm/lib/CodeGen/LiveVariables.cpp:1.59 --- llvm/lib/CodeGen/LiveVariables.cpp:1.58 Sat Sep 2 19:05:09 2006 +++ llvm/lib/CodeGen/LiveVariables.cpp Tue Sep 5 15:19:27 2006 @@ -248,7 +248,7 @@ // Process all explicit uses... for (unsigned i = 0; i != NumOperandsToProcess; ++i) { MachineOperand MO = MI-getOperand(i); -if (MO.isUse() MO.isRegister() MO.getReg()) { +if (MO.isRegister() MO.isUse() MO.getReg()) { if (MRegisterInfo::isVirtualRegister(MO.getReg())){ HandleVirtRegUse(getVarInfo(MO.getReg()), MBB, MI); } else if (MRegisterInfo::isPhysicalRegister(MO.getReg()) @@ -268,7 +268,7 @@ // Process all explicit defs... for (unsigned i = 0; i != NumOperandsToProcess; ++i) { MachineOperand MO = MI-getOperand(i); -if (MO.isDef() MO.isRegister() MO.getReg()) { +if (MO.isRegister() MO.isDef() MO.getReg()) { if (MRegisterInfo::isVirtualRegister(MO.getReg())) { VarInfo VRInfo = getVarInfo(MO.getReg()); Index: llvm/lib/CodeGen/MachineInstr.cpp diff -u llvm/lib/CodeGen/MachineInstr.cpp:1.124 llvm/lib/CodeGen/MachineInstr.cpp:1.125 --- llvm/lib/CodeGen/MachineInstr.cpp:1.124 Thu Jun 15 02:22:16 2006 +++ llvm/lib/CodeGen/MachineInstr.cpp Tue Sep 5 15:19:27 2006 @@ -158,7 +158,7 @@ unsigned StartOp = 0; // Specialize printing if op#0 is definition - if (getNumOperands() getOperand(0).isDef() !getOperand(0).isUse()) { + if (getNumOperands() getOperand(0).isReg() getOperand(0).isDef()) { ::print(getOperand(0), OS, TM); OS = ; ++StartOp; // Don't print this operand again! @@ -176,11 +176,8 @@ OS ; ::print(mop, OS, TM); -if (mop.isDef()) - if (mop.isUse()) -OS defuse; - else -OS def; +if (mop.isReg() mop.isDef()) + OS def; } OS \n; @@ -204,11 +201,8 @@ for (unsigned i = 0, N = MI.getNumOperands(); i N; i++) { os \t MI.getOperand(i); -if (MI.getOperand(i).isDef()) - if (MI.getOperand(i).isUse()) -os du; - else -os d; +if (MI.getOperand(i).isReg() MI.getOperand(i).isDef()) + os d; } return os \n; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.57 - 1.58 --- Log message: Move two methods out of line, make them work when the record for a machine instruction includes physregs. --- Diffs of the changes: (+36 -0) LiveVariables.cpp | 36 1 files changed, 36 insertions(+) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.57 llvm/lib/CodeGen/LiveVariables.cpp:1.58 --- llvm/lib/CodeGen/LiveVariables.cpp:1.57 Sun Aug 27 17:30:17 2006 +++ llvm/lib/CodeGen/LiveVariables.cpp Sat Sep 2 19:05:09 2006 @@ -415,3 +415,39 @@ RegistersDead.erase(OldMI); } } + +/// removeVirtualRegistersKilled - Remove all killed info for the specified +/// instruction. +void LiveVariables::removeVirtualRegistersKilled(MachineInstr *MI) { + std::mapMachineInstr*, std::vectorunsigned ::iterator I = +RegistersKilled.find(MI); + if (I == RegistersKilled.end()) return; + + std::vectorunsigned Regs = I-second; + for (unsigned i = 0, e = Regs.size(); i != e; ++i) { +if (MRegisterInfo::isVirtualRegister(Regs[i])) { + bool removed = getVarInfo(Regs[i]).removeKill(MI); + assert(removed kill not in register's VarInfo?); +} + } + RegistersKilled.erase(I); +} + +/// removeVirtualRegistersDead - Remove all of the dead registers for the +/// specified instruction from the live variable information. +void LiveVariables::removeVirtualRegistersDead(MachineInstr *MI) { + std::mapMachineInstr*, std::vectorunsigned ::iterator I = +RegistersDead.find(MI); + if (I == RegistersDead.end()) return; + + std::vectorunsigned Regs = I-second; + for (unsigned i = 0, e = Regs.size(); i != e; ++i) { +if (MRegisterInfo::isVirtualRegister(Regs[i])) { + bool removed = getVarInfo(Regs[i]).removeKill(MI); + assert(removed kill not in register's VarInfo?); +} + } + RegistersDead.erase(I); +} + + ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits