diff --git a/llvm/lib/Transforms/Utils/SSAUpdater.cpp b/llvm/lib/Transforms/Utils/SSAUpdater.cpp index 769e798faecf..292332e4f8a6 100644 --- a/llvm/lib/Transforms/Utils/SSAUpdater.cpp +++ b/llvm/lib/Transforms/Utils/SSAUpdater.cpp @@ -471,22 +471,27 @@ void SSAUpdater::RecordMatchingPHI(PHINode *PHI) { SmallVector WorkList; WorkList.push_back(PHI); + // Record this PHI. + BasicBlock *BB = PHI->getParent(); + AvailableVals[BB] = PHI; + (*BBMap)[BB]->AvailableVal = PHI; + while (!WorkList.empty()) { PHI = WorkList.pop_back_val(); - BasicBlock *BB = PHI->getParent(); - BBInfo *Info = (*BBMap)[BB]; - if (!Info || Info->AvailableVal) - return; - - // Record the PHI. - AvailableVals[BB] = PHI; - Info->AvailableVal = PHI; // Iterate through the PHI's incoming values. for (unsigned i = 0, e = PHI->getNumIncomingValues(); i != e; ++i) { - PHINode *IncomingVal = dyn_cast(PHI->getIncomingValue(i)); - if (!IncomingVal) continue; - WorkList.push_back(IncomingVal); + PHINode *IncomingPHIVal = dyn_cast(PHI->getIncomingValue(i)); + if (!IncomingPHIVal) continue; + BB = IncomingPHIVal->getParent(); + BBInfo *Info = (*BBMap)[BB]; + if (!Info || Info->AvailableVal) + continue; + + // Record the PHI and add it to the worklist. + AvailableVals[BB] = IncomingPHIVal; + Info->AvailableVal = IncomingPHIVal; + WorkList.push_back(IncomingPHIVal); } } } @@ -499,21 +504,24 @@ void SSAUpdater::ClearPHITags(PHINode *PHI) { SmallVector WorkList; WorkList.push_back(PHI); + // Clear the tag for this PHI. + (*BBMap)[PHI->getParent()]->PHITag = 0; + while (!WorkList.empty()) { PHI = WorkList.pop_back_val(); - BasicBlock *BB = PHI->getParent(); - BBInfo *Info = (*BBMap)[BB]; - if (!Info || Info->AvailableVal || !Info->PHITag) - continue; - - // Clear the tag. - Info->PHITag = 0; // Iterate through the PHI's incoming values. for (unsigned i = 0, e = PHI->getNumIncomingValues(); i != e; ++i) { - PHINode *IncomingVal = dyn_cast(PHI->getIncomingValue(i)); - if (!IncomingVal) continue; - WorkList.push_back(IncomingVal); + PHINode *IncomingPHIVal = dyn_cast(PHI->getIncomingValue(i)); + if (!IncomingPHIVal) continue; + BasicBlock *BB = IncomingPHIVal->getParent(); + BBInfo *Info = (*BBMap)[BB]; + if (!Info || Info->AvailableVal || !Info->PHITag) + continue; + + // Clear the tag and add the PHI to the worklist. + Info->PHITag = 0; + WorkList.push_back(IncomingPHIVal); } } }