[llvm-commits] [llvm] r41070 - /llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll
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
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
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
> 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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/
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/
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
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
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
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
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
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
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
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