From: Chris Lattner Date: Tue, 3 Feb 2004 22:00:33 +0000 (+0000) Subject: Handle extremely trivial cases extremely efficiently. This speeds up X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=7fecc2e5e28fa223b16280a5e434d7d0e03e9c52;p=oota-llvm.git Handle extremely trivial cases extremely efficiently. This speeds up SRoA/mem2reg from 41.2s to 27.5s on the testcase in PR209. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11099 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp index 0e1204f5db1..c1a13a220ea 100644 --- a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp +++ b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp @@ -400,25 +400,38 @@ void PromoteMem2Reg::MarkDominatingPHILive(BasicBlock *BB, unsigned AllocaNum, // void PromoteMem2Reg::PromoteLocallyUsedAlloca(AllocaInst *AI) { assert(!AI->use_empty() && "There are no uses of the alloca!"); - - // Uses of the uninitialized memory location shall get zero... - Value *CurVal = Constant::getNullValue(AI->getAllocatedType()); - BasicBlock *BB = cast(AI->use_back())->getParent(); - for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) { - Instruction *Inst = I++; - if (LoadInst *LI = dyn_cast(Inst)) { - if (LI->getOperand(0) == AI) { - // Loads just return the "current value"... - LI->replaceAllUsesWith(CurVal); - BB->getInstList().erase(LI); - } - } else if (StoreInst *SI = dyn_cast(Inst)) { - if (SI->getOperand(1) == AI) { - // Loads just update the "current value"... - CurVal = SI->getOperand(0); - BB->getInstList().erase(SI); + + // Handle degenerate cases quickly. + if (AI->hasOneUse()) { + Instruction *U = cast(AI->use_back()); + if (LoadInst *LI = dyn_cast(U)) { + // Must be a load of uninitialized value. + LI->replaceAllUsesWith(Constant::getNullValue(AI->getAllocatedType())); + } else { + // Otherwise it must be a store which is never read. + assert(isa(U)); + } + BB->getInstList().erase(U); + } else { + // Uses of the uninitialized memory location shall get zero... + Value *CurVal = Constant::getNullValue(AI->getAllocatedType()); + + for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) { + Instruction *Inst = I++; + if (LoadInst *LI = dyn_cast(Inst)) { + if (LI->getOperand(0) == AI) { + // Loads just return the "current value"... + LI->replaceAllUsesWith(CurVal); + BB->getInstList().erase(LI); + } + } else if (StoreInst *SI = dyn_cast(Inst)) { + if (SI->getOperand(1) == AI) { + // Loads just update the "current value"... + CurVal = SI->getOperand(0); + BB->getInstList().erase(SI); + } } } }