diff options
Diffstat (limited to 'contrib/llvm/lib/Transforms/ObjCARC/PtrState.cpp')
| -rw-r--r-- | contrib/llvm/lib/Transforms/ObjCARC/PtrState.cpp | 36 | 
1 files changed, 20 insertions, 16 deletions
diff --git a/contrib/llvm/lib/Transforms/ObjCARC/PtrState.cpp b/contrib/llvm/lib/Transforms/ObjCARC/PtrState.cpp index c1bbc4e96b16..d13e941044f1 100644 --- a/contrib/llvm/lib/Transforms/ObjCARC/PtrState.cpp +++ b/contrib/llvm/lib/Transforms/ObjCARC/PtrState.cpp @@ -244,6 +244,18 @@ void BottomUpPtrState::HandlePotentialUse(BasicBlock *BB, Instruction *Inst,                                            const Value *Ptr,                                            ProvenanceAnalysis &PA,                                            ARCInstKind Class) { +  auto SetSeqAndInsertReverseInsertPt = [&](Sequence NewSeq){ +    assert(!HasReverseInsertPts()); +    SetSeq(NewSeq); +    // If this is an invoke instruction, we're scanning it as part of +    // one of its successor blocks, since we can't insert code after it +    // in its own block, and we don't want to split critical edges. +    if (isa<InvokeInst>(Inst)) +      InsertReverseInsertPt(&*BB->getFirstInsertionPt()); +    else +      InsertReverseInsertPt(&*++Inst->getIterator()); +  }; +    // Check for possible direct uses.    switch (GetSeq()) {    case S_Release: @@ -251,26 +263,18 @@ void BottomUpPtrState::HandlePotentialUse(BasicBlock *BB, Instruction *Inst,      if (CanUse(Inst, Ptr, PA, Class)) {        DEBUG(dbgs() << "            CanUse: Seq: " << GetSeq() << "; " << *Ptr                     << "\n"); -      assert(!HasReverseInsertPts()); -      // If this is an invoke instruction, we're scanning it as part of -      // one of its successor blocks, since we can't insert code after it -      // in its own block, and we don't want to split critical edges. -      if (isa<InvokeInst>(Inst)) -        InsertReverseInsertPt(&*BB->getFirstInsertionPt()); -      else -        InsertReverseInsertPt(&*++Inst->getIterator()); -      SetSeq(S_Use); +      SetSeqAndInsertReverseInsertPt(S_Use);      } else if (Seq == S_Release && IsUser(Class)) {        DEBUG(dbgs() << "            PreciseReleaseUse: Seq: " << GetSeq() << "; "                     << *Ptr << "\n");        // Non-movable releases depend on any possible objc pointer use. -      SetSeq(S_Stop); -      assert(!HasReverseInsertPts()); -      // As above; handle invoke specially. -      if (isa<InvokeInst>(Inst)) -        InsertReverseInsertPt(&*BB->getFirstInsertionPt()); -      else -        InsertReverseInsertPt(&*++Inst->getIterator()); +      SetSeqAndInsertReverseInsertPt(S_Stop); +    } else if (const auto *Call = getreturnRVOperand(*Inst, Class)) { +      if (CanUse(Call, Ptr, PA, GetBasicARCInstKind(Call))) { +        DEBUG(dbgs() << "            ReleaseUse: Seq: " << GetSeq() << "; " +                     << *Ptr << "\n"); +        SetSeqAndInsertReverseInsertPt(S_Stop); +      }      }      break;    case S_Stop:  | 
