diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp | 13 | 
1 files changed, 12 insertions, 1 deletions
| diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp index 6ffaadc2b5f..9a02174556f 100644 --- a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp +++ b/llvm/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; | 

