From 3784188620c7a821415e060970f46cb04c8396ba Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 3 Feb 2004 22:00:33 +0000 Subject: [PATCH] Handle extremely trivial cases extremely efficiently. This speeds up SRoA/mem2reg from 41.2s to 27.5s on the testcase in PR209. llvm-svn: 11099 --- .../Utils/PromoteMemoryToRegister.cpp | 47 ++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp b/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp index 0e1204f5db17..c1a13a220ea6 100644 --- a/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp +++ b/llvm/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); + } } } }