[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp

2007-06-26 Thread Evan Cheng


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

2007-05-14 Thread Evan Cheng


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

2007-05-08 Thread Evan Cheng


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

2007-04-25 Thread Evan Cheng


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

2007-04-25 Thread Evan Cheng


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

2007-04-25 Thread Evan Cheng


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

2007-04-17 Thread Evan Cheng


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

2007-03-17 Thread Evan Cheng


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

2007-03-09 Thread Evan Cheng


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

2007-02-17 Thread Evan Cheng


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

2006-11-15 Thread Evan Cheng


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

2006-10-03 Thread Bill Wendling


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

2006-09-05 Thread Chris Lattner


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

2006-09-02 Thread Chris Lattner


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