Author: resistor Date: Tue Jan 29 19:24:47 2008 New Revision: 46542 URL: http://llvm.org/viewvc/llvm-project?rev=46542&view=rev Log: Make DSE much more aggressive by performing DCE earlier. Update a testcase to reflect this increased aggressiveness.
Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp llvm/trunk/test/Transforms/DeadStoreElimination/memcpy.ll Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=46542&r1=46541&r2=46542&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Jan 29 19:24:47 2008 @@ -152,7 +152,7 @@ possiblyDead.insert(D); if (Instruction* D = dyn_cast<Instruction>(last->getOperand(1))) possiblyDead.insert(D); - + last->eraseFromParent(); NumFastStores++; deletedStore = true; @@ -303,7 +303,7 @@ MD.removeInstruction(M); // DCE instructions only used to calculate that memcpy - if (Instruction* D = dyn_cast<Instruction>(M->getSource())) + if (Instruction* D = dyn_cast<Instruction>(M->getRawSource())) possiblyDead.insert(D); if (Instruction* D = dyn_cast<Instruction>(M->getLength())) possiblyDead.insert(D); @@ -325,11 +325,45 @@ // If we encounter a use of the pointer, it is no longer considered dead if (LoadInst* L = dyn_cast<LoadInst>(BBI)) { + // However, if this load is unused, we can go ahead and remove it, and + // not have to worry about it making our pointer undead! + if (L->getNumUses() == 0) { + MD.removeInstruction(L); + + // DCE instructions only used to calculate that load + if (Instruction* D = dyn_cast<Instruction>(L->getPointerOperand())) + possiblyDead.insert(D); + + BBI++; + L->eraseFromParent(); + NumFastOther++; + MadeChange = true; + possiblyDead.remove(L); + + continue; + } + killPointer = L->getPointerOperand(); } else if (VAArgInst* V = dyn_cast<VAArgInst>(BBI)) { killPointer = V->getOperand(0); } else if (AllocaInst* A = dyn_cast<AllocaInst>(BBI)) { deadPointers.erase(A); + + // Dead alloca's can be DCE'd when we reach them + if (A->getNumUses() == 0) { + MD.removeInstruction(A); + + // DCE instructions only used to calculate that load + if (Instruction* D = dyn_cast<Instruction>(A->getArraySize())) + possiblyDead.insert(D); + + BBI++; + A->eraseFromParent(); + NumFastOther++; + MadeChange = true; + possiblyDead.remove(A); + } + continue; } else if (CallSite::get(BBI).getInstruction() != 0) { // If this call does not access memory, it can't @@ -383,6 +417,25 @@ deadPointers.erase(*I); continue; + } else { + // For any non-memory-affecting non-terminators, DCE them as we reach them + Instruction *CI = BBI; + if (!CI->isTerminator() && CI->getNumUses() == 0) { + + // DCE instructions only used to calculate that load + for (Instruction::op_iterator OI = CI->op_begin(), OE = CI->op_end(); + OI != OE; ++OI) + if (Instruction* D = dyn_cast<Instruction>(OI)) + possiblyDead.insert(D); + + BBI++; + CI->eraseFromParent(); + NumFastOther++; + MadeChange = true; + possiblyDead.remove(CI); + + continue; + } } if (!killPointer) Modified: llvm/trunk/test/Transforms/DeadStoreElimination/memcpy.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/memcpy.ll?rev=46542&r1=46541&r2=46542&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/memcpy.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/memcpy.ll Tue Jan 29 19:24:47 2008 @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -dse | llvm-dis | not grep tmp180 +; RUN: llvm-as < %s | opt -dse | llvm-dis | not grep alloca ; ModuleID = 'placeholder.adb' target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32" target triple = "i686-pc-linux-gnu" _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits