From: Chris Lattner Date: Thu, 1 Nov 2001 03:12:34 +0000 (+0000) Subject: * Convert getelementptr/store pairs into a single store X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=8d38e54c2f1b58ba617892801183836f0a7d2ca8;p=oota-llvm.git * Convert getelementptr/store pairs into a single store * Convert getelementptr/load pairs into a single load git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1075 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/LevelRaise.cpp b/lib/Transforms/LevelRaise.cpp index 8074fdce045..db4e94e72e2 100644 --- a/lib/Transforms/LevelRaise.cpp +++ b/lib/Transforms/LevelRaise.cpp @@ -438,7 +438,7 @@ static bool PeepholeMallocInst(BasicBlock *BB, BasicBlock::iterator &BI) { static bool PeepholeOptimize(BasicBlock *BB, BasicBlock::iterator &BI) { Instruction *I = *BI; - if (I->use_size() == 0) return false; + if (I->use_size() == 0 && I->getType() != Type::VoidTy) return false; if (CastInst *CI = dyn_cast(I)) { Value *Src = CI->getOperand(0); @@ -484,6 +484,31 @@ static bool PeepholeOptimize(BasicBlock *BB, BasicBlock::iterator &BI) { } else if (MallocInst *MI = dyn_cast(I)) { if (PeepholeMallocInst(BB, BI)) return true; + + } else if (StoreInst *SI = dyn_cast(I)) { + Value *Val = SI->getOperand(0); + Value *Pointer = SI->getPtrOperand(); + + if (GetElementPtrInst *GEP = dyn_cast(Pointer)) { + PRINT_PEEPHOLE2("gep-store:in", GEP, SI); + ReplaceInstWithInst(BB->getInstList(), BI, + SI = new StoreInst(Val, GEP->getPtrOperand(), + GEP->getIndexVec())); + PRINT_PEEPHOLE1("gep-store:out", SI); + return true; + } + + } else if (LoadInst *LI = dyn_cast(I)) { + Value *Pointer = LI->getPtrOperand(); + + if (GetElementPtrInst *GEP = dyn_cast(Pointer)) { + PRINT_PEEPHOLE2("gep-load:in", GEP, LI); + ReplaceInstWithInst(BB->getInstList(), BI, + LI = new LoadInst(GEP->getPtrOperand(), + GEP->getIndexVec())); + PRINT_PEEPHOLE1("gep-load:out", LI); + return true; + } } else if (I->getOpcode() == Instruction::Add && isa(I->getOperand(1))) {