[llvm-commits] [llvm] r41070 - /llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll

2007-08-14 Thread Evan Cheng
Author: evancheng
Date: Tue Aug 14 04:16:00 2007
New Revision: 41070

URL: http://llvm.org/viewvc/llvm-project?rev=41070&view=rev
Log:
Update test case. A spill should now be deleted.

Modified:
llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll

Modified: llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll?rev=41070&r1=41069&r2=41070&view=diff

==
--- llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll (original)
+++ llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll Tue Aug 14 04:16:00 
2007
@@ -1,5 +1,6 @@
 ; RUN: llvm-as < %s | llc -march=x86-64 | grep LCPI | wc -l | grep 3
-; RUN: llvm-as < %s | llc -march=x86 | grep LCPI | wc -l | grep 3
+; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 | grep LCPI | wc -l | grep 3
+; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 -stats |& | grep asm-printer 
| grep 13
 
 declare float @qux(float %y)
 


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41069 - /llvm/trunk/lib/CodeGen/VirtRegMap.cpp

2007-08-14 Thread Evan Cheng
Author: evancheng
Date: Tue Aug 14 04:11:18 2007
New Revision: 41069

URL: http://llvm.org/viewvc/llvm-project?rev=41069&view=rev
Log:
If a spilled value is being reused and the use is a kill, that means there are
no more uses within the MBB and the spilled value isn't live out of the MBB.
Then it's safe to delete the spill store.

Modified:
llvm/trunk/lib/CodeGen/VirtRegMap.cpp

Modified: llvm/trunk/lib/CodeGen/VirtRegMap.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/VirtRegMap.cpp?rev=41069&r1=41068&r2=41069&view=diff

==
--- llvm/trunk/lib/CodeGen/VirtRegMap.cpp (original)
+++ llvm/trunk/lib/CodeGen/VirtRegMap.cpp Tue Aug 14 04:11:18 2007
@@ -554,7 +554,7 @@
 /// a new register to use, or evict the previous reload and use this reg. 
 unsigned GetRegForReload(unsigned PhysReg, MachineInstr *MI,
  AvailableSpills &Spills,
- std::map &MaybeDeadStores,
+ std::vector &MaybeDeadStores,
  SmallSet &Rejected,
  BitVector &RegKills,
  std::vector &KillOps,
@@ -609,14 +609,13 @@
 } else {
   MRI->loadRegFromStackSlot(*MBB, MI, NewPhysReg,
 NewOp.StackSlotOrReMat, AliasRC);
+  // Any stores to this stack slot are not dead anymore.
+  MaybeDeadStores[NewOp.StackSlotOrReMat] = NULL;
   ++NumLoads;
 }
 Spills.ClobberPhysReg(NewPhysReg);
 Spills.ClobberPhysReg(NewOp.PhysRegReused);
 
-// Any stores to this stack slot are not dead anymore.
-MaybeDeadStores.erase(NewOp.StackSlotOrReMat);
-
 MI->getOperand(NewOp.Operand).setReg(NewPhysReg);
 
 Spills.addAvailable(NewOp.StackSlotOrReMat, MI, NewPhysReg);
@@ -649,7 +648,7 @@
 ///   sees r1 is taken by t2, tries t2's reload register r0 ...
 unsigned GetRegForReload(unsigned PhysReg, MachineInstr *MI,
  AvailableSpills &Spills,
- std::map &MaybeDeadStores,
+ std::vector &MaybeDeadStores,
  BitVector &RegKills,
  std::vector &KillOps,
  VirtRegMap &VRM) {
@@ -666,6 +665,8 @@
 void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) {
   DOUT << MBB.getBasicBlock()->getName() << ":\n";
 
+  MachineFunction &MF = *MBB.getParent();
+
   // Spills - Keep track of which spilled values are available in physregs so
   // that we can choose to reuse the physregs instead of emitting reloads.
   AvailableSpills Spills(MRI, TII);
@@ -676,14 +677,14 @@
   // subsequently stored to, the original store is dead.  This map keeps track
   // of inserted stores that are not used.  If we see a subsequent store to the
   // same stack slot, the original store is deleted.
-  std::map MaybeDeadStores;
+  std::vector MaybeDeadStores;
+  MaybeDeadStores.resize(MF.getFrameInfo()->getObjectIndexEnd(), NULL);
 
   // Keep track of kill information.
   BitVector RegKills(MRI->getNumRegs());
   std::vector  KillOps;
   KillOps.resize(MRI->getNumRegs(), NULL);
 
-  MachineFunction &MF = *MBB.getParent();
   for (MachineBasicBlock::iterator MII = MBB.begin(), E = MBB.end();
MII != E; ) {
 MachineInstr &MI = *MII;
@@ -806,6 +807,21 @@
 // Only mark it clobbered if this is a use&def operand.
 ReusedOperands.markClobbered(PhysReg);
   ++NumReused;
+
+  if (MI.getOperand(i).isKill() &&
+  ReuseSlot <= VirtRegMap::MAX_STACK_SLOT) {
+// This was the last use and the spilled value is still available
+// for reuse. That means the spill was unnecessary!
+MachineInstr* DeadStore = MaybeDeadStores[ReuseSlot];
+if (DeadStore) {
+  DOUT << "Removed dead store:\t" << *DeadStore;
+  InvalidateKills(*DeadStore, RegKills, KillOps);
+  MBB.erase(DeadStore);
+  VRM.RemoveFromFoldedVirtMap(DeadStore);
+  MaybeDeadStores[ReuseSlot] = NULL;
+  ++NumDSE;
+}
+  }
   continue;
 }
 
@@ -892,7 +908,7 @@
 
   // Any stores to this stack slot are not dead anymore.
   if (!DoReMat)
-MaybeDeadStores.erase(SSorRMId);
+MaybeDeadStores[SSorRMId] = NULL;
   Spills.addAvailable(SSorRMId, &MI, PhysReg);
   // Assumes this is the last use. IsKill will be unset if reg is reused
   // unless it's a two-address operand.
@@ -953,20 +969,18 @@
 
   // If this reference is not a use, any previous store is now dead.
   // Otherwise, the store to this stack slot is not dead anymore.
-  std

[llvm-commits] [llvm-gcc-4.2] r41071 - /llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp

2007-08-14 Thread Chris Lattner
Author: lattner
Date: Tue Aug 14 10:45:39 2007
New Revision: 41071

URL: http://llvm.org/viewvc/llvm-project?rev=41071&view=rev
Log:
When building casts, constant fold with ConstantFoldInstruction instead
of ConstantExpr::getCast.  This allows target-data driven constant folding
to happen.  In the testcase from PR1602, for example, this results in:

%tmp26 = sub i32 %tmp232425, 1  

instead of:

%tmp26 = sub i32 %tmp232425, ptrtoint (i32 (...)** inttoptr (i64 1 to 
i32 (...)**) to i32)



Modified:
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp

Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=41071&r1=41070&r2=41071&view=diff

==
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Tue Aug 14 10:45:39 2007
@@ -34,6 +34,7 @@
 #include "llvm/InlineAsm.h"
 #include "llvm/Instructions.h"
 #include "llvm/Module.h"
+#include "llvm/Analysis/ConstantFolding.h"
 #include "llvm/Target/TargetAsmInfo.h"
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetMachine.h"
@@ -1045,16 +1046,26 @@
   if (V->getType() == Ty) 
 return V;
 
+  // If this is a simple constant operand, fold it now.  If it is a constant
+  // expr operand, fold it below.
   if (Constant *C = dyn_cast(V))
-return ConstantExpr::getCast(Instruction::CastOps(opcode), C, Ty);
+if (!isa(C))
+  return ConstantExpr::getCast(Instruction::CastOps(opcode), C, Ty);
   
   // Handle 'trunc (zext i1 X to T2) to i1' as X, because this occurs all over
   // the place.
   if (ZExtInst *CI = dyn_cast(V))
 if (Ty == Type::Int1Ty && CI->getOperand(0)->getType() == Type::Int1Ty)
   return CI->getOperand(0);
-  return Builder.CreateCast(Instruction::CastOps(opcode), V, Ty,
-V->getName().c_str());
+  Value *Result = Builder.CreateCast(Instruction::CastOps(opcode), V, Ty,
+ V->getNameStart());
+
+  // If this is a constantexpr, fold the instruction with
+  // ConstantFoldInstruction to allow TargetData-driven folding to occur.
+  if (isa(V))
+Result = ConstantFoldInstruction(cast(Result), &TD);
+  
+  return Result;
 }
 
 /// CastToAnyType - Cast the specified value to the specified type making no


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


Re: [llvm-commits] [llvm] r41052 - in /llvm/trunk: include/llvm/Analysis/Dominators.h lib/VMCore/Dominators.cpp

2007-08-14 Thread Chris Lattner
> URL: http://llvm.org/viewvc/llvm-project?rev=41052&view=rev
> Log:
> Add methods to erase basic block entry.
>
> +  /// removeBlock - Remove basic block BB's frontier.
> +  void removeBlock(BasicBlock *BB) {
> +assert(find(BB) != end() && "Block is not in  
> DominanceFrontier!");
> +iterator BBDF = Frontiers.find(BB);
> +Frontiers.erase(BBDF);

This can just do: Frontiers.erase(BB);

>
> +/// eraseNode - Removes a node from  the domiantor tree. Block  
> must not

domiantor -> dominator

> +/// domiante any other blocks. Removes node from its immediate  
> dominator's

domiante -> dominate

> +/// children list. Deletes dominator node associated with basic  
> block BB.
> +void DominatorTreeBase::eraseNode(BasicBlock *BB) {

Since this can only remove leaf nodes (no children in the domtree)  
would it make sense to name this eraseLeafNode?

> +  DomTreeNode *Node = getNode(BB);
> +  assert (Node && "Removing node that isn't in dominator tree.");
> +
> +// Remove node from immediate dominator's children list.
> +  DomTreeNode *IDom = Node->getIDom();
> +  if (IDom) {
> +std::vector::iterator I =
> +  std::find(IDom->Children.begin(), IDom->Children.end(), Node);
> +assert(I != IDom->Children.end() &&
> +   "Not in immediate dominator children set!");
> +// I am no longer your child...
> +IDom->Children.erase(I);
> +  }
> +
> +  assert (Node->getChildren().empty() && "Children list is not  
> empty");

Please move this assertion up to the top, say "Node is not a leaf" or  
something.

Thanks Devang,

-Chris

___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41072 - /llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll

2007-08-14 Thread Chris Lattner
Author: lattner
Date: Tue Aug 14 11:14:10 2007
New Revision: 41072

URL: http://llvm.org/viewvc/llvm-project?rev=41072&view=rev
Log:
switch this to use fastcc to avoid fpstack traffic on x86-32.  Switch to 
using the count script instead of wc -l

Modified:
llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll

Modified: llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll?rev=41072&r1=41071&r2=41072&view=diff

==
--- llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll (original)
+++ llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll Tue Aug 14 11:14:10 
2007
@@ -1,12 +1,12 @@
-; RUN: llvm-as < %s | llc -march=x86-64 | grep LCPI | wc -l | grep 3
-; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 | grep LCPI | wc -l | grep 3
+; RUN: llvm-as < %s | llc -march=x86-64 | grep LCPI | count 3
+; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 | grep LCPI | count 3
 ; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 -stats |& | grep asm-printer 
| grep 13
 
-declare float @qux(float %y)
+declare fastcc float @qux(float %y)
 
-define float @array(float %a) {
+define fastcc float @array(float %a) {
   %n = mul float %a, 9.0
-  %m = call float @qux(float %n)
+  %m = call fastcc float @qux(float %n)
   %o = mul float %m, 9.0
   ret float %o
 }


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41073 - /llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll

2007-08-14 Thread Chris Lattner
Author: lattner
Date: Tue Aug 14 11:19:35 2007
New Revision: 41073

URL: http://llvm.org/viewvc/llvm-project?rev=41073&view=rev
Log:
tcl seems to hate |& for some reason.

Modified:
llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll

Modified: llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll?rev=41073&r1=41072&r2=41073&view=diff

==
--- llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll (original)
+++ llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll Tue Aug 14 11:19:35 
2007
@@ -1,6 +1,6 @@
 ; RUN: llvm-as < %s | llc -march=x86-64 | grep LCPI | count 3
 ; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 | grep LCPI | count 3
-; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 -stats |& | grep asm-printer 
| grep 13
+; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 -stats -info-output-file - | 
grep asm-printer | grep 9
 
 declare fastcc float @qux(float %y)
 


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


Re: [llvm-commits] [llvm] r41070 - /llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll

2007-08-14 Thread Chris Lattner

On Aug 14, 2007, at 2:16 AM, Evan Cheng wrote:

> Author: evancheng
> Date: Tue Aug 14 04:16:00 2007
> New Revision: 41070
>
> URL: http://llvm.org/viewvc/llvm-project?rev=41070&view=rev
> Log:
> Update test case. A spill should now be deleted.
>
> Modified:
> llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll

Nice.  I tweaked it to avoid the fpstack stuff on x86-32.  I'm now  
getting:

x86-32:

_array:
 subl$12, %esp
 movss   LCPI1_0, %xmm0
 mulss   16(%esp), %xmm0
 movss   %xmm0, (%esp)
 callL_qux$stub
 movss   LCPI1_0, %xmm1
 mulss   %xmm1, %xmm0
 addl$12, %esp
 ret

x86-64:

_array:
 subq$8, %rsp
 movss   LCPI1_0(%rip), %xmm1
 mulss   %xmm1, %xmm0
 call_qux
 movss   LCPI1_0(%rip), %xmm1
 mulss   %xmm1, %xmm0
 addq$8, %rsp
 ret

Both look great, but we should still fold the remat load into the  
muls :)

-Chris
___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


Re: [llvm-commits] [llvm] r41070 - /llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll

2007-08-14 Thread Chris Lattner

On Aug 14, 2007, at 9:22 AM, Chris Lattner wrote:

>
> On Aug 14, 2007, at 2:16 AM, Evan Cheng wrote:
>
>> Author: evancheng
>> Date: Tue Aug 14 04:16:00 2007
>> New Revision: 41070
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=41070&view=rev
>> Log:
>> Update test case. A spill should now be deleted.
>>
>> Modified:
>> llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll
>
> Nice.  I tweaked it to avoid the fpstack stuff on x86-32.  I'm now
> getting:

More food for thought :).  I tried this out on PPC and got the  
following code:

_array:
 mflr r0
 stw r0, 8(r1)
 stwu r1, -64(r1)
AAA stfd f14, 56(r1)
 lis r2, ha16(LCPI1_0)
BBB lfs f14, lo16(LCPI1_0)(r2)
 fmuls f1, f1, f14
 bl L_qux$stub
 fmuls f1, f1, f14
AAA lfd f14, 56(r1)
 addi r1, r1, 64
 lwz r0, 8(r1)
 mtlr r0
 blr

On PPC, this isn't a simple remat case, because the lfs instruction  
uses r2 (BBB) (the same occurs on ARM, and it is a simple remat case  
there).  However, the thing I find interesting about this is that  
remat'ing the load from the constant pool would avoid having to save/ 
restore the callee save register f14 (BBB).  I don't know how common  
this is, but I expect the same could happen on x86 with callee-save  
GPRs as well.  It seems tricky to handle well though.

-Chris
___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41074 - /llvm/trunk/include/llvm/Analysis/Dominators.h

2007-08-14 Thread Devang Patel
Author: dpatel
Date: Tue Aug 14 11:53:24 2007
New Revision: 41074

URL: http://llvm.org/viewvc/llvm-project?rev=41074&view=rev
Log:
No need to use iterator to erase basic block.

Modified:
llvm/trunk/include/llvm/Analysis/Dominators.h

Modified: llvm/trunk/include/llvm/Analysis/Dominators.h
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/Dominators.h?rev=41074&r1=41073&r2=41074&view=diff

==
--- llvm/trunk/include/llvm/Analysis/Dominators.h (original)
+++ llvm/trunk/include/llvm/Analysis/Dominators.h Tue Aug 14 11:53:24 2007
@@ -253,7 +253,7 @@
 changeImmediateDominator(getNode(BB), getNode(NewBB));
   }
 
-  /// eraseNode - Removes a node from  the domiantor tree. Block must not
+  /// eraseNode - Removes a node from  the dominator tree. Block must not
   /// domiante any other blocks. Removes node from its immediate dominator's
   /// children list. Deletes dominator node associated with basic block BB.
   void eraseNode(BasicBlock *BB);
@@ -378,8 +378,10 @@
   /// removeBlock - Remove basic block BB's frontier.
   void removeBlock(BasicBlock *BB) {
 assert(find(BB) != end() && "Block is not in DominanceFrontier!");
-iterator BBDF = Frontiers.find(BB);
-Frontiers.erase(BBDF);
+for (iterator I = begin(), E = end(); I != E; ++I)
+  if (I->second.count(BB))
+I->second.erase(BB);
+Frontiers.erase(BB);
   }
 
   void addToFrontier(iterator I, BasicBlock *Node) {


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41075 - /llvm/trunk/lib/VMCore/Dominators.cpp

2007-08-14 Thread Devang Patel
Author: dpatel
Date: Tue Aug 14 11:53:52 2007
New Revision: 41075

URL: http://llvm.org/viewvc/llvm-project?rev=41075&view=rev
Log:
Assert sooner. Fix wordings.

Modified:
llvm/trunk/lib/VMCore/Dominators.cpp

Modified: llvm/trunk/lib/VMCore/Dominators.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Dominators.cpp?rev=41075&r1=41074&r2=41075&view=diff

==
--- llvm/trunk/lib/VMCore/Dominators.cpp (original)
+++ llvm/trunk/lib/VMCore/Dominators.cpp Tue Aug 14 11:53:52 2007
@@ -565,7 +565,8 @@
 void DominatorTreeBase::eraseNode(BasicBlock *BB) {
   DomTreeNode *Node = getNode(BB);
   assert (Node && "Removing node that isn't in dominator tree.");
-  
+  assert (Node->getChildren().empty() && "Node is not a leaf node.");
+
 // Remove node from immediate dominator's children list.
   DomTreeNode *IDom = Node->getIDom();
   if (IDom) {
@@ -577,8 +578,6 @@
 IDom->Children.erase(I);
   }
   
-  assert (Node->getChildren().empty() && "Children list is not empty");
-  
   DomTreeNodes.erase(BB);
   delete Node;
 }


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41077 - /llvm/trunk/lib/Transforms/Scalar/GVN.cpp

2007-08-14 Thread Owen Anderson
Author: resistor
Date: Tue Aug 14 12:59:48 2007
New Revision: 41077

URL: http://llvm.org/viewvc/llvm-project?rev=41077&view=rev
Log:
Fix a case where GVN was failing to return true when it had, in fact, modified
the function.

Modified:
llvm/trunk/lib/Transforms/Scalar/GVN.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=41077&r1=41076&r2=41077&view=diff

==
--- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Tue Aug 14 12:59:48 2007
@@ -856,10 +856,19 @@
   
   // ... to a pointer that has been loaded from before...
   MemoryDependenceAnalysis& MD = getAnalysis();
+  bool removedNonLocal = false;
   Instruction* dep = MD.getDependency(L);
   if (dep == MemoryDependenceAnalysis::NonLocal &&
-  L->getParent() != &L->getParent()->getParent()->getEntryBlock())
-processNonLocalLoad(L, toErase);
+  L->getParent() != &L->getParent()->getParent()->getEntryBlock()) {
+removedNonLocal = processNonLocalLoad(L, toErase);
+
+if (!removedNonLocal)
+  last = L;
+
+return removedNonLocal;
+  }
+  
+  
   bool deletedLoad = false;
   
   while (dep != MemoryDependenceAnalysis::None &&


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41078 - /llvm/trunk/lib/Transforms/Scalar/GVN.cpp

2007-08-14 Thread Owen Anderson
Author: resistor
Date: Tue Aug 14 13:04:11 2007
New Revision: 41078

URL: http://llvm.org/viewvc/llvm-project?rev=41078&view=rev
Log:
Make GVN iterative.

Modified:
llvm/trunk/lib/Transforms/Scalar/GVN.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=41078&r1=41077&r2=41078&view=diff

==
--- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Tue Aug 14 13:04:11 2007
@@ -671,6 +671,7 @@
 DenseMap &Phis,
 bool top_level = false);
 void dump(DenseMap& d);
+bool iterateOnFunction(Function &F);
   };
   
   char GVN::ID = 0;
@@ -944,7 +945,21 @@
 // GVN::runOnFunction - This is the main transformation entry point for a
 // function.
 //
-bool GVN::runOnFunction(Function &F) {
+bool GVN::runOnFunction(Function& F) {
+  bool changed = false;
+  bool shouldContinue = true;
+  
+  while (shouldContinue) {
+shouldContinue = iterateOnFunction(F);
+changed |= shouldContinue;
+  }
+  
+  return changed;
+}
+
+
+// GVN::iterateOnFunction - Executes one iteration of GVN
+bool GVN::iterateOnFunction(Function &F) {
   // Clean out global sets from any previous functions
   VN.clear();
   availableOut.clear();


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41080 - /llvm/trunk/lib/Transforms/Scalar/GVN.cpp

2007-08-14 Thread Owen Anderson
Author: resistor
Date: Tue Aug 14 13:16:29 2007
New Revision: 41080

URL: http://llvm.org/viewvc/llvm-project?rev=41080&view=rev
Log:
Be more aggressive in pruning unnecessary PHI nodes when doing PHI construction.

Modified:
llvm/trunk/lib/Transforms/Scalar/GVN.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=41080&r1=41079&r2=41080&view=diff

==
--- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Tue Aug 14 13:16:29 2007
@@ -749,40 +749,59 @@
   if (Phis.count(BB) == 0)
 Phis.insert(std::make_pair(BB, PN));
   
-  bool all_same = true;
-  Value* first = 0;
-  
   // Fill in the incoming values for the block.
   for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
 Value* val = GetValueForBlock(*PI, orig, Phis);
-if (first == 0)
-  first = val;
-else if (all_same && first != val)
-  all_same = false;
 
 PN->addIncoming(val, *PI);
   }
   
-  if (all_same) {
-MemoryDependenceAnalysis& MD = getAnalysis();
-
-MD.removeInstruction(PN);
-PN->replaceAllUsesWith(first);
-
-SmallVector toRemove;
-for (DenseMap::iterator I = Phis.begin(),
- E = Phis.end(); I != E; ++I)
-  if (I->second == PN)
-toRemove.push_back(I->first);
-for (SmallVector::iterator I = toRemove.begin(),
- E= toRemove.end(); I != E; ++I)
-  Phis[*I] = first;
-
-PN->eraseFromParent();
-
-Phis[BB] = first;
-
-return first;
+  Value* v = PN->hasConstantValue();
+  if (v) {
+if (Instruction* inst = dyn_cast(v)) {
+  DominatorTree &DT = getAnalysis();  
+  if (DT.dominates(inst, PN)) {
+MemoryDependenceAnalysis& MD = getAnalysis();
+
+MD.removeInstruction(PN);
+PN->replaceAllUsesWith(inst);
+
+SmallVector toRemove;
+for (DenseMap::iterator I = Phis.begin(),
+ E = Phis.end(); I != E; ++I)
+  if (I->second == PN)
+toRemove.push_back(I->first);
+for (SmallVector::iterator I = toRemove.begin(),
+ E= toRemove.end(); I != E; ++I)
+  Phis[*I] = inst;
+
+PN->eraseFromParent();
+
+Phis[BB] = inst;
+
+return inst;
+  }
+} else {
+  MemoryDependenceAnalysis& MD = getAnalysis();
+
+  MD.removeInstruction(PN);
+  PN->replaceAllUsesWith(v);
+
+  SmallVector toRemove;
+  for (DenseMap::iterator I = Phis.begin(),
+   E = Phis.end(); I != E; ++I)
+if (I->second == PN)
+  toRemove.push_back(I->first);
+  for (SmallVector::iterator I = toRemove.begin(),
+   E= toRemove.end(); I != E; ++I)
+Phis[*I] = v;
+
+  PN->eraseFromParent();
+
+  Phis[BB] = v;
+
+  return v;
+}
   }
 
   phiMap[orig->getPointerOperand()].insert(PN);
@@ -915,7 +934,7 @@
   return deletedLoad;
 }
 
-/// buildsets_availout - When calculating availability, handle an instruction
+/// processInstruction - When calculating availability, handle an instruction
 /// by inserting it into the appropriate sets
 bool GVN::processInstruction(Instruction* I,
 ValueNumberedSet& currAvail,


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41081 - /llvm/trunk/lib/Transforms/Scalar/GVN.cpp

2007-08-14 Thread Owen Anderson
Author: resistor
Date: Tue Aug 14 13:33:27 2007
New Revision: 41081

URL: http://llvm.org/viewvc/llvm-project?rev=41081&view=rev
Log:
Eliminate PHI nodes with constant values during normal GVN processing, even when
they're not related to eliminating a load.

Modified:
llvm/trunk/lib/Transforms/Scalar/GVN.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=41081&r1=41080&r2=41081&view=diff

==
--- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Tue Aug 14 13:33:27 2007
@@ -946,7 +946,27 @@
   
   unsigned num = VN.lookup_or_add(I);
   
-  if (currAvail.test(num)) {
+  if (PHINode* p = dyn_cast(I)) {
+Value* constVal = p->hasConstantValue();
+
+if (constVal) {
+  if (Instruction* inst = dyn_cast(constVal)) {
+DominatorTree &DT = getAnalysis();  
+if (DT.dominates(inst, p)) {
+  for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
+   PI != PE; ++PI)
+if (PI->second.count(p))
+  PI->second.erase(p);
+
+  p->replaceAllUsesWith(inst);
+  toErase.push_back(p);
+}
+  } else {
+p->replaceAllUsesWith(constVal);
+toErase.push_back(p);
+  }
+}
+  } else if (currAvail.test(num)) {
 Value* repl = find_leader(currAvail, num);
 
 VN.erase(I);


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41082 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

2007-08-14 Thread Devang Patel
Author: dpatel
Date: Tue Aug 14 13:35:57 2007
New Revision: 41082

URL: http://llvm.org/viewvc/llvm-project?rev=41082&view=rev
Log:
Fix dominance frontier update while removing blocks.


Modified:
llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=41082&r1=41081&r2=41082&view=diff

==
--- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Tue Aug 14 13:35:57 2007
@@ -97,8 +97,10 @@
 /// loop may not be eliminated.
 bool safeExitBlock(SplitInfo &SD, BasicBlock *BB);
 
-/// removeBlocks - Remove basic block BB and all blocks dominated by BB.
-void removeBlocks(BasicBlock *InBB, Loop *LP);
+/// removeBlocks - Remove basic block DeadBB and all blocks dominated by 
DeadBB.
+/// This routine is used to remove split condition's dead branch, 
dominated by
+/// DeadBB. LiveBB dominates split conidition's other branch.
+void removeBlocks(BasicBlock *DeadBB, Loop *LP, BasicBlock *LiveBB);
 
 /// Find cost of spliting loop L.
 unsigned findSplitCost(Loop *L, SplitInfo &SD);
@@ -589,11 +591,14 @@
   return Cost;
 }
 
-/// removeBlocks - Remove basic block BB and all blocks dominated by BB.
-void LoopIndexSplit::removeBlocks(BasicBlock *InBB, Loop *LP) {
+/// removeBlocks - Remove basic block DeadBB and all blocks dominated by 
DeadBB.
+/// This routine is used to remove split condition's dead branch, dominated by
+/// DeadBB. LiveBB dominates split conidition's other branch.
+void LoopIndexSplit::removeBlocks(BasicBlock *DeadBB, Loop *LP, 
+  BasicBlock *LiveBB) {
 
   SmallVector, 8> WorkList;
-  WorkList.push_back(std::make_pair(InBB, succ_begin(InBB)));
+  WorkList.push_back(std::make_pair(DeadBB, succ_begin(DeadBB)));
   while (!WorkList.empty()) {
 BasicBlock *BB = WorkList.back(). first; 
 succ_iterator SIter =WorkList.back().second;
@@ -630,10 +635,28 @@
 break;
 }
 
+DT->changeImmediateDominator(SuccBB, LiveBB);
+
 // If BB is not dominating SuccBB then SuccBB is in BB's dominance
 // frontiner. 
 DominanceFrontier::iterator BBDF = DF->find(BB);
 DF->removeFromFrontier(BBDF, SuccBB);
+
+// LiveBB is now  dominating SuccBB. Which means SuccBB's dominance
+// frontier is member of LiveBB's dominance frontier. However, SuccBB
+// itself is not member of LiveBB's dominance frontier.
+DominanceFrontier::iterator LiveDF = DF->find(LiveBB);
+DominanceFrontier::iterator SuccDF = DF->find(SuccBB);
+DominanceFrontier::DomSetType SuccBBSet = SuccDF->second;
+for (DominanceFrontier::DomSetType::iterator SuccBBSetI = 
SuccBBSet.begin(),
+   SuccBBSetE = SuccBBSet.end(); SuccBBSetI != SuccBBSetE; 
++SuccBBSetI) {
+  BasicBlock *DFMember = *SuccBBSetI;
+  // Insert only if LiveBB dominates DFMember.
+  if (!DT->dominates(LiveBB, DFMember))
+LiveDF->second.insert(DFMember);
+}
+DF->removeFromFrontier(LiveDF, SuccBB);
+
   }
 }
   }
@@ -747,7 +770,7 @@
   BranchInst *BR = cast(SplitBlock->getTerminator());
   BasicBlock *FBB = BR->getSuccessor(1);
   BR->setUnconditionalDest(BR->getSuccessor(0));
-  removeBlocks(FBB, L);
+  removeBlocks(FBB, L, BR->getSuccessor(0));
 
   //[*] Update True loop's exit value using new exit value.
   ExitCondition->setOperand(ExitValueNum, TLExitValue);
@@ -757,7 +780,7 @@
   BranchInst *FBR = cast(FSplitBlock->getTerminator());
   BasicBlock *TBB = FBR->getSuccessor(0);
   FBR->setUnconditionalDest(FBR->getSuccessor(1));
-  removeBlocks(TBB, FalseLoop);
+  removeBlocks(TBB, FalseLoop, cast(FBR->getSuccessor(0)));
 
   return true;
 }


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


Re: [llvm-commits] [llvm] r41073 - /llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll

2007-08-14 Thread Reid Spencer
Chris

On Tue, 2007-08-14 at 16:19 +, Chris Lattner wrote:
> Author: lattner
> Date: Tue Aug 14 11:19:35 2007
> New Revision: 41073
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=41073&view=rev
> Log:
> tcl seems to hate |& for some reason.
> 
> Modified:
> llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll
> 
> Modified: llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll
> URL: 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll?rev=41073&r1=41072&r2=41073&view=diff
> 
> ==
> --- llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll Tue Aug 14 11:19:35 
> 2007
> @@ -1,6 +1,6 @@
>  ; RUN: llvm-as < %s | llc -march=x86-64 | grep LCPI | count 3
>  ; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 | grep LCPI | count 3
> -; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 -stats |& | grep 
> asm-printer | grep 13

|& works fine (see test/Feature/load_module.ll).  The problem is the
double pipe. |& | is not legal (no command in the pipeline). |& means
send both stdin and stderr through the pipe, not just stderr.

Reid.

> +; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 -stats -info-output-file - 
> | grep asm-printer | grep 9
>  
>  declare fastcc float @qux(float %y)
>  
> 
> 
> ___
> llvm-commits mailing list
> llvm-commits@cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


Re: [llvm-commits] [llvm] r41073 - /llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll

2007-08-14 Thread Chris Lattner

On Aug 14, 2007, at 12:25 PM, Reid Spencer wrote:

> Chris
>
> On Tue, 2007-08-14 at 16:19 +, Chris Lattner wrote:
>> Author: lattner
>> Date: Tue Aug 14 11:19:35 2007
>> New Revision: 41073
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=41073&view=rev
>> Log:
>> tcl seems to hate |& for some reason.
>>
>> Modified:
>> llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll
>>
>> Modified: llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ 
>> X86/constant-pool-remat-0.ll?rev=41073&r1=41072&r2=41073&view=diff
>>
>> = 
>> =
>> --- llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll (original)
>> +++ llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll Tue Aug  
>> 14 11:19:35 2007
>> @@ -1,6 +1,6 @@
>>  ; RUN: llvm-as < %s | llc -march=x86-64 | grep LCPI | count 3
>>  ; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 | grep LCPI |  
>> count 3
>> -; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 -stats |& |  
>> grep asm-printer | grep 13
>
> |& works fine (see test/Feature/load_module.ll).  The problem is the
> double pipe. |& | is not legal (no command in the pipeline). |& means
> send both stdin and stderr through the pipe, not just stderr.

Actually no it doesn't.  I tried just |& and it didn't detect the  
failure.

-Chris
___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41083 - /llvm/trunk/lib/CodeGen/VirtRegMap.cpp

2007-08-14 Thread Evan Cheng
Author: evancheng
Date: Tue Aug 14 15:23:13 2007
New Revision: 41083

URL: http://llvm.org/viewvc/llvm-project?rev=41083&view=rev
Log:
If a MI's def is remat as well as spilled, and the store is later deemed dead, 
mark the def operand as isDead.

Modified:
llvm/trunk/lib/CodeGen/VirtRegMap.cpp

Modified: llvm/trunk/lib/CodeGen/VirtRegMap.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/VirtRegMap.cpp?rev=41083&r1=41082&r2=41083&view=diff

==
--- llvm/trunk/lib/CodeGen/VirtRegMap.cpp (original)
+++ llvm/trunk/lib/CodeGen/VirtRegMap.cpp Tue Aug 14 15:23:13 2007
@@ -433,12 +433,39 @@
 /// InvalidateKills - MI is going to be deleted. If any of its operands are
 /// marked kill, then invalidate the information.
 static void InvalidateKills(MachineInstr &MI, BitVector &RegKills,
-   std::vector &KillOps) {
+std::vector &KillOps,
+MachineInstr *NewDef = NULL) {
   for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
 MachineOperand &MO = MI.getOperand(i);
 if (!MO.isReg() || !MO.isUse() || !MO.isKill())
   continue;
 unsigned Reg = MO.getReg();
+if (NewDef) {
+  // Due to remat, it's possible this reg isn't being reused. That is,
+  // the def of this reg (by prev MI) is now dead.
+  bool FoundUse = false, Done = false;
+  MachineBasicBlock::iterator I = MI, E = NewDef;
+  ++I; ++E;
+  for (; !Done && I != E; ++I) {
+MachineInstr *NMI = I;
+for (unsigned j = 0, ee = NMI->getNumOperands(); j != ee; ++j) {
+  MachineOperand &MO = NMI->getOperand(j);
+  if (!MO.isReg() || MO.getReg() != Reg)
+continue;
+  if (MO.isUse())
+FoundUse = true;
+  Done = true; // Stop after scanning all the operands of this MI.
+}
+  }
+  if (!FoundUse) {
+// Def is dead!
+MachineBasicBlock::iterator MII = MI;
+MachineInstr *DefMI = prior(MII);
+MachineOperand *DefOp = DefMI->findRegisterDefOperand(Reg);
+assert(DefOp && "Missing def?");
+DefOp->setIsDead();
+  }
+}
 if (KillOps[Reg] == &MO) {
   RegKills.reset(Reg);
   KillOps[Reg] = NULL;
@@ -1081,7 +1108,7 @@
 if (LastStore) {
   DOUT << "Removed dead store:\t" << *LastStore;
   ++NumDSE;
-  InvalidateKills(*LastStore, RegKills, KillOps);
+  InvalidateKills(*LastStore, RegKills, KillOps, &MI);
   MBB.erase(LastStore);
   VRM.RemoveFromFoldedVirtMap(LastStore);
 }


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41084 - /llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp

2007-08-14 Thread Evan Cheng
Author: evancheng
Date: Tue Aug 14 18:19:28 2007
New Revision: 41084

URL: http://llvm.org/viewvc/llvm-project?rev=41084&view=rev
Log:
Fix for PR1596: AdjustCopiesBackFrom() should conservatively check if any of 
its sub-registers may overlap with the interval of the copy that's being 
coalesced.

Modified:
llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp

Modified: llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp?rev=41084&r1=41083&r2=41084&view=diff

==
--- llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp (original)
+++ llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp Tue Aug 14 18:19:28 2007
@@ -125,6 +125,19 @@
   // live-range starts.  If there are no intervening live ranges between them 
in
   // IntB, we can merge them.
   if (ValLR+1 != BLR) return false;
+
+  // If a live interval is a physical register, conservatively check if any
+  // of its sub-registers is overlapping the live interval of the virtual
+  // register. If so, do not coalesce.
+  if (MRegisterInfo::isPhysicalRegister(IntB.reg) &&
+  *mri_->getSubRegisters(IntB.reg)) {
+for (const unsigned* SR = mri_->getSubRegisters(IntB.reg); *SR; ++SR)
+  if (li_->hasInterval(*SR) && IntA.overlaps(li_->getInterval(*SR))) {
+DOUT << "Interfere with sub-register ";
+DEBUG(li_->getInterval(*SR).print(DOUT, mri_));
+return false;
+  }
+  }
   
   DOUT << "\nExtending: "; IntB.print(DOUT, mri_);
   


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41085 - /llvm/trunk/test/CodeGen/PowerPC/2007-08-04-CoalescerAssert.ll

2007-08-14 Thread Evan Cheng
Author: evancheng
Date: Tue Aug 14 18:21:10 2007
New Revision: 41085

URL: http://llvm.org/viewvc/llvm-project?rev=41085&view=rev
Log:
Test case for PR1596.

Added:
llvm/trunk/test/CodeGen/PowerPC/2007-08-04-CoalescerAssert.ll

Added: llvm/trunk/test/CodeGen/PowerPC/2007-08-04-CoalescerAssert.ll
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/2007-08-04-CoalescerAssert.ll?rev=41085&view=auto

==
--- llvm/trunk/test/CodeGen/PowerPC/2007-08-04-CoalescerAssert.ll (added)
+++ llvm/trunk/test/CodeGen/PowerPC/2007-08-04-CoalescerAssert.ll Tue Aug 14 
18:21:10 2007
@@ -0,0 +1,28 @@
+; RUN: llvm-as < %s | llc -march=ppc64
+; PR1596
+
+   %struct._obstack_chunk = type { i8* }
+   %struct.obstack = type { i8*, %struct._obstack_chunk* (i8*, i64)*, i8*, 
i8 }
+
+define i32 @_obstack_newchunk(%struct.obstack* %h, i32 %length) {
+entry:
+   br i1 false, label %cond_false, label %cond_true
+
+cond_true: ; preds = %entry
+   br i1 false, label %cond_true28, label %cond_next30
+
+cond_false:; preds = %entry
+   %tmp22 = tail call %struct._obstack_chunk* null( i64 undef )
; <%struct._obstack_chunk*> [#uses=2]
+   br i1 false, label %cond_true28, label %cond_next30
+
+cond_true28:   ; preds = %cond_false, %cond_true
+   %iftmp.0.043.0 = phi %struct._obstack_chunk* [ null, %cond_true ], [ 
%tmp22, %cond_false ]  ; <%struct._obstack_chunk*> [#uses=1]
+   tail call void null( )
+   br label %cond_next30
+
+cond_next30:   ; preds = %cond_true28, %cond_false, %cond_true
+   %iftmp.0.043.1 = phi %struct._obstack_chunk* [ %iftmp.0.043.0, 
%cond_true28 ], [ null, %cond_true ], [ %tmp22, %cond_false ]; 
<%struct._obstack_chunk*> [#uses=1]
+   %tmp41 = getelementptr %struct._obstack_chunk* %iftmp.0.043.1, i32 0, 
i32 0 ;  [#uses=1]
+   store i8* null, i8** %tmp41, align 8
+   ret i32 undef
+}


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41086 - /llvm/trunk/lib/CodeGen/VirtRegMap.cpp

2007-08-14 Thread Evan Cheng
Author: evancheng
Date: Tue Aug 14 18:25:37 2007
New Revision: 41086

URL: http://llvm.org/viewvc/llvm-project?rev=41086&view=rev
Log:
- If a def is dead, do not spill it.
- If the defs of a spilled rematerializable MI are dead after the spill store 
is deleted, delete
  the def MI as well.

Modified:
llvm/trunk/lib/CodeGen/VirtRegMap.cpp

Modified: llvm/trunk/lib/CodeGen/VirtRegMap.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/VirtRegMap.cpp?rev=41086&r1=41085&r2=41086&view=diff

==
--- llvm/trunk/lib/CodeGen/VirtRegMap.cpp (original)
+++ llvm/trunk/lib/CodeGen/VirtRegMap.cpp Tue Aug 14 18:25:37 2007
@@ -36,6 +36,7 @@
 
 STATISTIC(NumSpills, "Number of register spills");
 STATISTIC(NumReMats, "Number of re-materialization");
+STATISTIC(NumDRM   , "Number of re-materializable defs elided");
 STATISTIC(NumStores, "Number of stores added");
 STATISTIC(NumLoads , "Number of loads added");
 STATISTIC(NumReused, "Number of values reused");
@@ -434,38 +435,14 @@
 /// marked kill, then invalidate the information.
 static void InvalidateKills(MachineInstr &MI, BitVector &RegKills,
 std::vector &KillOps,
-MachineInstr *NewDef = NULL) {
+SmallVector *KillRegs = NULL) {
   for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
 MachineOperand &MO = MI.getOperand(i);
 if (!MO.isReg() || !MO.isUse() || !MO.isKill())
   continue;
 unsigned Reg = MO.getReg();
-if (NewDef) {
-  // Due to remat, it's possible this reg isn't being reused. That is,
-  // the def of this reg (by prev MI) is now dead.
-  bool FoundUse = false, Done = false;
-  MachineBasicBlock::iterator I = MI, E = NewDef;
-  ++I; ++E;
-  for (; !Done && I != E; ++I) {
-MachineInstr *NMI = I;
-for (unsigned j = 0, ee = NMI->getNumOperands(); j != ee; ++j) {
-  MachineOperand &MO = NMI->getOperand(j);
-  if (!MO.isReg() || MO.getReg() != Reg)
-continue;
-  if (MO.isUse())
-FoundUse = true;
-  Done = true; // Stop after scanning all the operands of this MI.
-}
-  }
-  if (!FoundUse) {
-// Def is dead!
-MachineBasicBlock::iterator MII = MI;
-MachineInstr *DefMI = prior(MII);
-MachineOperand *DefOp = DefMI->findRegisterDefOperand(Reg);
-assert(DefOp && "Missing def?");
-DefOp->setIsDead();
-  }
-}
+if (KillRegs)
+  KillRegs->push_back(Reg);
 if (KillOps[Reg] == &MO) {
   RegKills.reset(Reg);
   KillOps[Reg] = NULL;
@@ -473,6 +450,51 @@
   }
 }
 
+/// InvalidateRegDef - If the def operand of the specified def MI is now dead
+/// (since it's spill instruction is removed), mark it isDead. Also checks if
+/// the def MI has other definition operands that are not dead. Returns it by
+/// reference.
+static bool InvalidateRegDef(MachineBasicBlock::iterator I,
+ MachineInstr &NewDef, unsigned Reg,
+ bool &HasLiveDef) {
+  // Due to remat, it's possible this reg isn't being reused. That is,
+  // the def of this reg (by prev MI) is now dead.
+  MachineInstr *DefMI = I;
+  MachineOperand *DefOp = NULL;
+  for (unsigned i = 0, e = DefMI->getNumOperands(); i != e; ++i) {
+MachineOperand &MO = DefMI->getOperand(i);
+if (MO.isReg() && MO.isDef()) {
+  if (MO.getReg() == Reg)
+DefOp = &MO;
+  else if (!MO.isDead())
+HasLiveDef = true;
+}
+  }
+  if (!DefOp)
+return false;
+
+  bool FoundUse = false, Done = false;
+  MachineBasicBlock::iterator E = NewDef;
+  ++I; ++E;
+  for (; !Done && I != E; ++I) {
+MachineInstr *NMI = I;
+for (unsigned j = 0, ee = NMI->getNumOperands(); j != ee; ++j) {
+  MachineOperand &MO = NMI->getOperand(j);
+  if (!MO.isReg() || MO.getReg() != Reg)
+continue;
+  if (MO.isUse())
+FoundUse = true;
+  Done = true; // Stop after scanning all the operands of this MI.
+}
+  }
+  if (!FoundUse) {
+// Def is dead!
+DefOp->setIsDead();
+return true;
+  }
+  return false;
+}
+
 /// UpdateKills - Track and update kill info. If a MI reads a register that is
 /// marked kill, then it must be due to register reuse. Transfer the kill info
 /// over.
@@ -707,6 +729,9 @@
   std::vector MaybeDeadStores;
   MaybeDeadStores.resize(MF.getFrameInfo()->getObjectIndexEnd(), NULL);
 
+  // ReMatDefs - These are rematerializable def MIs which are not deleted.
+  SmallSet ReMatDefs;
+
   // Keep track of kill information.
   BitVector RegKills(MRI->getNumRegs());
   std::vector  KillOps;
@@ -1077,6 +1102,10 @@
   continue;
 }
 
+bool DoReMat = VRM.isReMaterialized(VirtReg);
+if (DoReMat)
+  ReMatDefs.insert(&MI);
+
 // The only vregs left are stack slot definitions.
 int StackSlot

[llvm-commits] [llvm] r41087 - /llvm/trunk/test/CodeGen/ARM/2007-08-14-SpillDeadDef.ll

2007-08-14 Thread Evan Cheng
Author: evancheng
Date: Tue Aug 14 18:34:50 2007
New Revision: 41087

URL: http://llvm.org/viewvc/llvm-project?rev=41087&view=rev
Log:
New test.

Added:
llvm/trunk/test/CodeGen/ARM/2007-08-14-SpillDeadDef.ll

Added: llvm/trunk/test/CodeGen/ARM/2007-08-14-SpillDeadDef.ll
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/2007-08-14-SpillDeadDef.ll?rev=41087&view=auto

==
--- llvm/trunk/test/CodeGen/ARM/2007-08-14-SpillDeadDef.ll (added)
+++ llvm/trunk/test/CodeGen/ARM/2007-08-14-SpillDeadDef.ll Tue Aug 14 18:34:50 
2007
@@ -0,0 +1,116 @@
+; RUN: llvm-as < %s | llc -mtriple=arm-apple-darwin 
+; RUN: llvm-as < %s | llc -mtriple=arm-apple-darwin -stats -info-output-file - 
| grep "re-materializable defs elided"
+
+   %struct.CONTENTBOX = type { i32, i32, i32, i32, i32 }
+   %struct.LOCBOX = type { i32, i32, i32, i32 }
+   %struct.SIDEBOX = type { i32, i32 }
+   %struct.UNCOMBOX = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, 
i32, i32 }
+   %struct.cellbox = type { i8*, i32, i32, i32, [9 x i32], i32, i32, i32, 
i32, i32, i32, i32, double, double, double, double, double, i32, i32, 
%struct.CONTENTBOX*, %struct.UNCOMBOX*, [8 x %struct.tilebox*], 
%struct.SIDEBOX* }
+   %struct.termbox = type { %struct.termbox*, i32, i32, i32, i32, i32 }
+   %struct.tilebox = type { %struct.tilebox*, double, double, double, 
double, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, 
%struct.termbox*, %struct.LOCBOX* }
[EMAIL PROTECTED] = external global i32 ;  [#uses=1]
[EMAIL PROTECTED] = external global %struct.cellbox**   ; 
<%struct.cellbox***> [#uses=1]
[EMAIL PROTECTED] = external global i32 ;  [#uses=1]
+
+define fastcc void @fixpenal() {
+entry:
+   %tmp491 = load i32* @numcells, align 4  ;  [#uses=1]
+   %tmp9 = load %struct.cellbox*** @cellarray, align 4 ; 
<%struct.cellbox**> [#uses=1]
+   %tmp77.i = load i32* @numBinsY, align 4 ;  [#uses=2]
+   br label %bb490
+
+bb8:   ; preds = %bb490, %cond_false428
+   br i1 false, label %cond_false58.i, label %cond_false.i
+
+cond_false.i:  ; preds = %bb8
+   ret void
+
+cond_false58.i:; preds = %bb8
+   %highBinX.0.i = select i1 false, i32 1, i32 0   ;  
[#uses=2]
+   br i1 false, label %cond_next85.i, label %cond_false76.i
+
+cond_false76.i:; preds = %cond_false58.i
+   ret void
+
+cond_next85.i: ; preds = %cond_false58.i
+   br i1 false, label %cond_next105.i, label %cond_false98.i
+
+cond_false98.i:; preds = %cond_next85.i
+   ret void
+
+cond_next105.i:; preds = %cond_next85.i
+   %tmp108.i = icmp eq i32 1, %highBinX.0.i;  [#uses=1]
+   %tmp115.i = icmp eq i32 1, %tmp77.i ;  [#uses=1]
+   %bothcond.i = and i1 %tmp115.i, %tmp108.i   ;  [#uses=1]
+   %storemerge.i = select i1 %bothcond.i, i32 1, i32 0 ;  
[#uses=2]
+   br i1 false, label %whoOverlaps.exit, label %bb503.preheader.i
+
+bb503.preheader.i: ; preds = %bb513.i, %cond_next105.i
+   %i.022.0.i = phi i32 [ %tmp512.i, %bb513.i ], [ 0, %cond_next105.i ]
;  [#uses=2]
+   %tmp165.i = getelementptr i32*** null, i32 %i.022.0.i   ; 
 [#uses=0]
+   br label %bb503.i
+
+bb137.i:   ; preds = %bb503.i
+   br i1 false, label %bb162.i, label %bb148.i
+
+bb148.i:   ; preds = %bb137.i
+   ret void
+
+bb162.i:   ; preds = %bb137.i
+   %tmp49435.i = load i32* null;  [#uses=1]
+   br label %bb170.i
+
+bb170.i:   ; preds = %bb491.i, %bb162.i
+   %indvar.i = phi i32 [ %k.032.0.i, %bb491.i ], [ 0, %bb162.i ]   
;  [#uses=2]
+   %k.032.0.i = add i32 %indvar.i, 1   ;  [#uses=2]
+   %tmp173.i = getelementptr i32* null, i32 %k.032.0.i ; 
 [#uses=1]
+   %tmp174.i = load i32* %tmp173.i ;  [#uses=4]
+   %tmp177.i = icmp eq i32 %tmp174.i, %cell.1  ;  [#uses=1]
+   %tmp184.i = icmp sgt i32 %tmp174.i, %tmp491 ;  [#uses=1]
+   %bothcond = or i1 %tmp177.i, %tmp184.i  ;  [#uses=1]
+   br i1 %bothcond, label %bb491.i, label %cond_next188.i
+
+cond_next188.i:; preds = %bb170.i
+   %tmp191.i = getelementptr %struct.cellbox** %tmp9, i32 %tmp174.i
; <%struct.cellbox**> [#uses=1]
+   %tmp192.i = load %struct.cellbox** %tmp191.i; 
<%struct.cellbox*> [#uses=1]
+   %tmp195.i = icmp eq i32 %tmp174.i, 0;  [#uses=1]
+   br i1 %tmp195.i, label %bb491.i, label %cond_true198.i
+
+cond_true198.i:; preds = %cond_next188.i
+   %tmp210.i = getelementptr %struct.cellbox* %tmp192.i, i32 0, i32 3  
;  [#uses=0]
+   ret void
+
+bb491.i:  

[llvm-commits] [llvm-gcc-4.0] r41088 - /llvm-gcc-4.0/tags/llvm-gcc-1200-08/

2007-08-14 Thread Bill Wendling
Author: void
Date: Tue Aug 14 18:53:04 2007
New Revision: 41088

URL: http://llvm.org/viewvc/llvm-project?rev=41088&view=rev
Log:
Creating llvm-gcc-1200-08 branch

Added:
llvm-gcc-4.0/tags/llvm-gcc-1200-08/
  - copied from r41087, llvm-gcc-4.0/trunk/

___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41089 - /llvm/tags/Apple/llvm-1200-08/

2007-08-14 Thread Bill Wendling
Author: void
Date: Tue Aug 14 18:53:10 2007
New Revision: 41089

URL: http://llvm.org/viewvc/llvm-project?rev=41089&view=rev
Log:
Creating llvm-1200-08 branch

Added:
llvm/tags/Apple/llvm-1200-08/
  - copied from r41088, llvm/trunk/

___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41090 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

2007-08-14 Thread Devang Patel
Author: dpatel
Date: Tue Aug 14 18:53:57 2007
New Revision: 41090

URL: http://llvm.org/viewvc/llvm-project?rev=41090&view=rev
Log:
Avoid nested loops at the moment.

Modified:
llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=41090&r1=41089&r2=41090&view=diff

==
--- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Tue Aug 14 18:53:57 2007
@@ -154,6 +154,10 @@
   L = IncomingLoop;
   LPM = &LPM_Ref;
 
+  // FIXME - Nested loops makes dominator info updates tricky. 
+  if (!L->getSubLoops().empty())
+return false;
+
   SE = &getAnalysis();
   DT = &getAnalysis();
   LI = &getAnalysis();


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41091 - /llvm/trunk/lib/Transforms/Utils/CloneLoop.cpp

2007-08-14 Thread Devang Patel
Author: dpatel
Date: Tue Aug 14 18:59:17 2007
New Revision: 41091

URL: http://llvm.org/viewvc/llvm-project?rev=41091&view=rev
Log:
Break infinite loop.

Modified:
llvm/trunk/lib/Transforms/Utils/CloneLoop.cpp

Modified: llvm/trunk/lib/Transforms/Utils/CloneLoop.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/CloneLoop.cpp?rev=41091&r1=41090&r2=41091&view=diff

==
--- llvm/trunk/lib/Transforms/Utils/CloneLoop.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/CloneLoop.cpp Tue Aug 14 18:59:17 2007
@@ -84,22 +84,21 @@
   }
 
   SmallVector NewBlocks;
-  SmallVector, 8> LoopNest;
-  LoopNest.push_back(std::make_pair(OrigL, OrigL->begin()));
-  
-  Loop *NewLoop = NULL;
-  while (!LoopNest.empty()) {
-Loop *L = LoopNest.back().first;
-Loop::iterator SubLoop = LoopNest.back().second;
-
-// Handle sub loops.
-if (SubLoop != L->end()) {
-  Loop *SL  = *SubLoop;
-  LoopNest.push_back(std::make_pair(SL, SL->begin()));
-} 
 
+  // Populate loop nest.
+  SmallVector LoopNest;
+  LoopNest.push_back(OrigL);
+
+
+  Loop *NewParentLoop = NULL;
+  while (!LoopNest.empty()) {
+Loop *L = LoopNest.back();
 LoopNest.pop_back();
-NewLoop = new Loop();
+Loop *NewLoop = new Loop();
+
+if (!NewParentLoop)
+  NewParentLoop = NewLoop;
+
 LPM->insertLoop(NewLoop, L->getParentLoop());
 
 // Clone Basic Blocks.
@@ -122,6 +121,9 @@
 CloneDominatorInfo(BB, ValueMap, DT, DF);
   }
 
+// Process sub loops
+for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
+  LoopNest.push_back(*I);
   }
 
   // Remap instructions to reference operands from ValueMap.
@@ -145,5 +147,5 @@
   Function *F = Latch->getParent();
   F->getBasicBlockList().insert(Latch, NewBlocks.begin(), NewBlocks.end());
 
-  return NewLoop;
+  return NewParentLoop;
 }


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


Re: [llvm-commits] [llvm] r41074 - /llvm/trunk/include/llvm/Analysis/Dominators.h

2007-08-14 Thread Nick Lewycky
On Tue, 2007-08-14 at 16:53 +, Devang Patel wrote:
> +for (iterator I = begin(), E = end(); I != E; ++I)
> +  if (I->second.count(BB))
> +I->second.erase(BB);
> +Frontiers.erase(BB);
>}

Why test I->second.count()? The worst erase() will do if BB doesn't
exist is nothing. Just call erase() and it will cut the number of
lookups in half.

Nick


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41093 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

2007-08-14 Thread Devang Patel
Author: dpatel
Date: Tue Aug 14 21:14:55 2007
New Revision: 41093

URL: http://llvm.org/viewvc/llvm-project?rev=41093&view=rev
Log:
Avoid triangle loops.

Modified:
llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=41093&r1=41092&r2=41093&view=diff

==
--- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Tue Aug 14 21:14:55 2007
@@ -154,7 +154,7 @@
   L = IncomingLoop;
   LPM = &LPM_Ref;
 
-  // FIXME - Nested loops makes dominator info updates tricky. 
+  // FIXME - Nested loops make dominator info updates tricky. 
   if (!L->getSubLoops().empty())
 return false;
 
@@ -605,7 +605,7 @@
   WorkList.push_back(std::make_pair(DeadBB, succ_begin(DeadBB)));
   while (!WorkList.empty()) {
 BasicBlock *BB = WorkList.back(). first; 
-succ_iterator SIter =WorkList.back().second;
+succ_iterator SIter = WorkList.back().second;
 
 // If all successor's are processed then remove this block.
 if (SIter == succ_end(BB)) {
@@ -659,8 +659,8 @@
   if (!DT->dominates(LiveBB, DFMember))
 LiveDF->second.insert(DFMember);
 }
-DF->removeFromFrontier(LiveDF, SuccBB);
 
+DF->removeFromFrontier(LiveDF, SuccBB);
   }
 }
   }
@@ -669,6 +669,19 @@
 bool LoopIndexSplit::splitLoop(SplitInfo &SD) {
 
   BasicBlock *Preheader = L->getLoopPreheader();
+  BasicBlock *SplitBlock = SD.SplitCondition->getParent();
+  BasicBlock *Latch = L->getLoopLatch();
+  BasicBlock *Header = L->getHeader();
+  BranchInst *SplitTerminator = cast(SplitBlock->getTerminator());
+
+  // FIXME - Unable to handle triange loops at the moment.
+  // In triangle loop, split condition is in header and one of the
+  // the split destination is loop latch. If split condition is EQ
+  // then such loops are already handle in processOneIterationLoop().
+  if (Header == SplitBlock 
+  && (Latch == SplitTerminator->getSuccessor(0) 
+  || Latch == SplitTerminator->getSuccessor(1)))
+return false;
 
   // True loop is original loop. False loop is cloned loop.
 
@@ -770,7 +783,6 @@
   SplitEdge(ExitBlock, FalseHeader, this);
 
   //[*] Eliminate split condition's false branch from True loop.
-  BasicBlock *SplitBlock = SD.SplitCondition->getParent();
   BranchInst *BR = cast(SplitBlock->getTerminator());
   BasicBlock *FBB = BR->getSuccessor(1);
   BR->setUnconditionalDest(BR->getSuccessor(0));


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41094 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

2007-08-14 Thread Reid Spencer
Author: reid
Date: Tue Aug 14 22:01:04 2007
New Revision: 41094

URL: http://llvm.org/viewvc/llvm-project?rev=41094&view=rev
Log:
Remove unneeded header file.

Modified:
llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=41094&r1=41093&r2=41094&view=diff

==
--- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Tue Aug 14 22:01:04 2007
@@ -14,7 +14,6 @@
 #define DEBUG_TYPE "loop-index-split"
 
 #include "llvm/Transforms/Scalar.h"
-#include "llvm/Function.h"
 #include "llvm/Analysis/LoopPass.h"
 #include "llvm/Analysis/ScalarEvolutionExpander.h"
 #include "llvm/Analysis/Dominators.h"


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] [llvm] r41095 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

2007-08-14 Thread Devang Patel
Author: dpatel
Date: Tue Aug 14 22:31:47 2007
New Revision: 41095

URL: http://llvm.org/viewvc/llvm-project?rev=41095&view=rev
Log:
Cleanup removeBlocks. 
Use dominance frontier to fixup incoming edges of successor blocks not 
domianted by DeadBB.
Use df_iterator to walk and delete basic blocks dominated by DeadBB.


Modified:
llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=41095&r1=41094&r2=41095&view=diff

==
--- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Tue Aug 14 22:31:47 2007
@@ -20,6 +20,7 @@
 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
 #include "llvm/Transforms/Utils/Cloning.h"
 #include "llvm/Support/Compiler.h"
+#include "llvm/ADT/DepthFirstIterator.h"
 #include "llvm/ADT/Statistic.h"
 
 using namespace llvm;
@@ -47,6 +48,7 @@
   AU.addRequiredID(LoopSimplifyID);
   AU.addPreservedID(LoopSimplifyID);
   AU.addRequired();
+  AU.addRequired();
   AU.addPreserved();
   AU.addPreserved();
 }
@@ -600,68 +602,80 @@
 void LoopIndexSplit::removeBlocks(BasicBlock *DeadBB, Loop *LP, 
   BasicBlock *LiveBB) {
 
-  SmallVector, 8> WorkList;
-  WorkList.push_back(std::make_pair(DeadBB, succ_begin(DeadBB)));
-  while (!WorkList.empty()) {
-BasicBlock *BB = WorkList.back(). first; 
-succ_iterator SIter = WorkList.back().second;
-
-// If all successor's are processed then remove this block.
-if (SIter == succ_end(BB)) {
-  WorkList.pop_back();
-  for(BasicBlock::iterator BBI = BB->begin(), BBE = BB->end(); 
-  BBI != BBE; ++BBI) {
-Instruction *I = BBI;
-I->replaceAllUsesWith(UndefValue::get(I->getType()));
-I->eraseFromParent();
-  }
-  LPM->deleteSimpleAnalysisValue(BB, LP);
-  DT->eraseNode(BB);
-  DF->removeBlock(BB);
-  LI->removeBlock(BB);
-  BB->eraseFromParent();
-} else {
-  BasicBlock *SuccBB = *SIter;
-  ++WorkList.back().second;
+  // First update DeadBB's dominance frontier. 
+  DominanceFrontier::iterator DeadBBDF = DF->find(DeadBB);
+  if (DeadBBDF != DF->end()) {
+SmallVector PredBlocks;
+
+DominanceFrontier::DomSetType DeadBBSet = DeadBBDF->second;
+for (DominanceFrontier::DomSetType::iterator DeadBBSetI = 
DeadBBSet.begin(),
+   DeadBBSetE = DeadBBSet.end(); DeadBBSetI != DeadBBSetE; 
++DeadBBSetI) {
+  BasicBlock *FrontierBB = *DeadBBSetI;
   
-  if (DT->dominates(BB, SuccBB)) {
-WorkList.push_back(std::make_pair(SuccBB, succ_begin(SuccBB)));
-continue;
-  } else {
-// If SuccBB is not dominated by BB then it is not removed, however 
remove
-// any PHI incoming edge from BB.
-for(BasicBlock::iterator SBI = SuccBB->begin(), SBE = SuccBB->end();
-SBI != SBE; ++SBI) {
-  if (PHINode *PN = dyn_cast(SBI)) 
-PN->removeIncomingValue(BB);
-  else
-break;
+  // Rremove any PHI incoming edge from blocks dominated by DeadBB.
+  PredBlocks.clear();
+  for(pred_iterator PI = pred_begin(FrontierBB), PE = pred_end(FrontierBB);
+  PI != PE; ++PI) {
+BasicBlock *P = *PI;
+if (P == DeadBB || DT->dominates(DeadBB, P))
+  PredBlocks.push_back(P);
+  }
+  
+  for(BasicBlock::iterator FBI = FrontierBB->begin(), FBE = 
FrontierBB->end();
+  FBI != FBE; ++FBI) {
+if (PHINode *PN = dyn_cast(FBI)) {
+  for(SmallVector::iterator PI = PredBlocks.begin(),
+PE = PredBlocks.end(); PI != PE; ++PI) {
+BasicBlock *P = *PI;
+PN->removeIncomingValue(P);
+  }
 }
+else
+  break;
+  }
 
-DT->changeImmediateDominator(SuccBB, LiveBB);
-
-// If BB is not dominating SuccBB then SuccBB is in BB's dominance
-// frontiner. 
-DominanceFrontier::iterator BBDF = DF->find(BB);
-DF->removeFromFrontier(BBDF, SuccBB);
-
-// LiveBB is now  dominating SuccBB. Which means SuccBB's dominance
-// frontier is member of LiveBB's dominance frontier. However, SuccBB
-// itself is not member of LiveBB's dominance frontier.
-DominanceFrontier::iterator LiveDF = DF->find(LiveBB);
-DominanceFrontier::iterator SuccDF = DF->find(SuccBB);
-DominanceFrontier::DomSetType SuccBBSet = SuccDF->second;
-for (DominanceFrontier::DomSetType::iterator SuccBBSetI = 
SuccBBSet.begin(),
-   SuccBBSetE = SuccBBSet.end(); SuccBBSetI != SuccBBSetE; 
++SuccBBSetI) {
-  BasicBlock *DFMember = *SuccBBSetI;
-  // Insert only if LiveBB dominates DFMember.
-  if (!DT->dominates(LiveBB, DFMember))
- 

[llvm-commits] [llvm] r41096 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

2007-08-14 Thread Devang Patel
Author: dpatel
Date: Tue Aug 14 22:34:53 2007
New Revision: 41096

URL: http://llvm.org/viewvc/llvm-project?rev=41096&view=rev
Log:
Dominance frontier is now required.

Modified:
llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=41096&r1=41095&r2=41096&view=diff

==
--- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Tue Aug 14 22:34:53 2007
@@ -162,7 +162,7 @@
   SE = &getAnalysis();
   DT = &getAnalysis();
   LI = &getAnalysis();
-  DF = getAnalysisToUpdate();
+  DF = &getAnalysis();
 
   initialize();
 


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits