diff options
Diffstat (limited to 'lib/Transforms/ObjCARC/ObjCARCOpts.cpp')
| -rw-r--r-- | lib/Transforms/ObjCARC/ObjCARCOpts.cpp | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/lib/Transforms/ObjCARC/ObjCARCOpts.cpp b/lib/Transforms/ObjCARC/ObjCARCOpts.cpp index 21e2848030fc..9a02174556fc 100644 --- a/lib/Transforms/ObjCARC/ObjCARCOpts.cpp +++ b/lib/Transforms/ObjCARC/ObjCARCOpts.cpp @@ -600,6 +600,17 @@ ObjCARCOpt::OptimizeRetainRVCall(Function &F, Instruction *RetainRV) { } } + // Track PHIs which are equivalent to our Arg. + SmallDenseSet<const Value*, 2> EquivalentArgs; + EquivalentArgs.insert(Arg); + + // Add PHIs that are equivalent to Arg to ArgUsers. + if (const PHINode *PN = dyn_cast<PHINode>(Arg)) { + SmallVector<const Value *, 2> ArgUsers; + getEquivalentPHIs(*PN, ArgUsers); + EquivalentArgs.insert(ArgUsers.begin(), ArgUsers.end()); + } + // Check for being preceded by an objc_autoreleaseReturnValue on the same // pointer. In this case, we can delete the pair. BasicBlock::iterator I = RetainRV->getIterator(), @@ -609,7 +620,7 @@ ObjCARCOpt::OptimizeRetainRVCall(Function &F, Instruction *RetainRV) { --I; while (I != Begin && IsNoopInstruction(&*I)); if (GetBasicARCInstKind(&*I) == ARCInstKind::AutoreleaseRV && - GetArgRCIdentityRoot(&*I) == Arg) { + EquivalentArgs.count(GetArgRCIdentityRoot(&*I))) { Changed = true; ++NumPeeps; @@ -914,8 +925,8 @@ void ObjCARCOpt::OptimizeIndividualCalls(Function &F) { GetRCIdentityRoot(PN->getIncomingValue(i)); if (IsNullOrUndef(Incoming)) HasNull = true; - else if (cast<TerminatorInst>(PN->getIncomingBlock(i)->back()) - .getNumSuccessors() != 1) { + else if (PN->getIncomingBlock(i)->getTerminator()->getNumSuccessors() != + 1) { HasCriticalEdges = true; break; } @@ -1084,18 +1095,15 @@ ObjCARCOpt::CheckForCFGHazards(const BasicBlock *BB, "Unknown top down sequence state."); const Value *Arg = I->first; - const TerminatorInst *TI = cast<TerminatorInst>(&BB->back()); bool SomeSuccHasSame = false; bool AllSuccsHaveSame = true; bool NotAllSeqEqualButKnownSafe = false; - succ_const_iterator SI(TI), SE(TI, false); - - for (; SI != SE; ++SI) { + for (const BasicBlock *Succ : successors(BB)) { // If VisitBottomUp has pointer information for this successor, take // what we know about it. const DenseMap<const BasicBlock *, BBState>::iterator BBI = - BBStates.find(*SI); + BBStates.find(Succ); assert(BBI != BBStates.end()); const BottomUpPtrState &SuccS = BBI->second.getPtrBottomUpState(Arg); const Sequence SuccSSeq = SuccS.GetSeq(); @@ -1414,21 +1422,20 @@ ComputePostOrders(Function &F, BasicBlock *EntryBB = &F.getEntryBlock(); BBState &MyStates = BBStates[EntryBB]; MyStates.SetAsEntry(); - TerminatorInst *EntryTI = cast<TerminatorInst>(&EntryBB->back()); + Instruction *EntryTI = EntryBB->getTerminator(); SuccStack.push_back(std::make_pair(EntryBB, succ_iterator(EntryTI))); Visited.insert(EntryBB); OnStack.insert(EntryBB); do { dfs_next_succ: BasicBlock *CurrBB = SuccStack.back().first; - TerminatorInst *TI = cast<TerminatorInst>(&CurrBB->back()); - succ_iterator SE(TI, false); + succ_iterator SE(CurrBB->getTerminator(), false); while (SuccStack.back().second != SE) { BasicBlock *SuccBB = *SuccStack.back().second++; if (Visited.insert(SuccBB).second) { - TerminatorInst *TI = cast<TerminatorInst>(&SuccBB->back()); - SuccStack.push_back(std::make_pair(SuccBB, succ_iterator(TI))); + SuccStack.push_back( + std::make_pair(SuccBB, succ_iterator(SuccBB->getTerminator()))); BBStates[CurrBB].addSucc(SuccBB); BBState &SuccStates = BBStates[SuccBB]; SuccStates.addPred(CurrBB); |
