diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp index 86bbc602e39b..bd5b02895ec3 100644 --- a/llvm/lib/Transforms/Scalar/GVN.cpp +++ b/llvm/lib/Transforms/Scalar/GVN.cpp @@ -816,8 +816,9 @@ Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction *Orig, else NumPreds = std::distance(pred_begin(BB), pred_end(BB)); - // Otherwise, the idom is the loop, so we need to insert a PHI node. Do so - // now, then get values to fill in the incoming values for the PHI. + // Otherwise, we may need to insert a PHI node. Do so now, then get values to + // fill in the incoming values for the PHI. If the PHI ends up not being + // needed, we can always remove it later. PHINode *PN = PHINode::Create(Orig->getType(), Orig->getName()+".rle", BB->begin()); PN->reserveOperandSpace(NumPreds); @@ -832,7 +833,8 @@ Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction *Orig, VN.getAliasAnalysis()->copyValue(Orig, PN); - // Attempt to collapse PHI nodes that are trivially redundant + // Attempt to collapse PHI nodes that are trivially redundant. This happens + // when we construct a PHI that ends up not being needed. Value *v = CollapsePhi(PN); if (!v) { // Cache our phi construction results @@ -1777,8 +1779,8 @@ Value *GVN::AttemptRedundancyElimination(Instruction *orig, unsigned valno) { // If we didn't find instances, give up. Otherwise, perform phi construction. if (Results.size() == 0) return 0; - else - return GetValueForBlock(BaseBlock, orig, Results, true); + + return GetValueForBlock(BaseBlock, orig, Results, true); } /// processInstruction - When calculating availability, handle an instruction diff --git a/llvm/lib/Transforms/Utils/LCSSA.cpp b/llvm/lib/Transforms/Utils/LCSSA.cpp index 48e6a17a0661..af54add385ee 100644 --- a/llvm/lib/Transforms/Utils/LCSSA.cpp +++ b/llvm/lib/Transforms/Utils/LCSSA.cpp @@ -197,9 +197,8 @@ void LCSSA::ProcessInstruction(Instruction *Instr, for (Value::use_iterator UI = Instr->use_begin(), E = Instr->use_end(); UI != E;) { BasicBlock *UserBB = cast(*UI)->getParent(); - if (PHINode *P = dyn_cast(*UI)) { + if (PHINode *P = dyn_cast(*UI)) UserBB = P->getIncomingBlock(UI); - } // If the user is in the loop, don't rewrite it! if (UserBB == Instr->getParent() || inLoop(UserBB)) { @@ -231,12 +230,11 @@ void LCSSA::getLoopValuesUsedOutsideLoop(Loop *L, for (Loop::block_iterator BB = L->block_begin(), BE = L->block_end(); BB != BE; ++BB) { for (BasicBlock::iterator I = (*BB)->begin(), E = (*BB)->end(); I != E; ++I) - for (Value::use_iterator UI = I->use_begin(), UE = I->use_end(); UI != UE; - ++UI) { + for (Value::use_iterator UI = I->use_begin(), UE = I->use_end(); + UI != UE; ++UI) { BasicBlock *UserBB = cast(*UI)->getParent(); - if (PHINode* p = dyn_cast(*UI)) { + if (PHINode *p = dyn_cast(*UI)) UserBB = p->getIncomingBlock(UI); - } if (*BB != UserBB && !inLoop(UserBB)) { AffectedValues.insert(I); @@ -288,7 +286,7 @@ Value *LCSSA::GetValueForBlock(DomTreeNode *BB, Instruction *OrigInst, Phis.insert(std::make_pair(BB, PN)); // Fill in the incoming values for the block. - for (BasicBlock** PI = PredCache.GetPreds(BBN); *PI; ++PI) + for (BasicBlock **PI = PredCache.GetPreds(BBN); *PI; ++PI) PN->addIncoming(GetValueForBlock(DT->getNode(*PI), OrigInst, Phis), *PI); return PN; }