bool Changed = false;
+ DEBUG(dbgs() << "ObjCARCExpand: Visiting Function: " << F.getName() << "\n");
+
for (inst_iterator I = inst_begin(&F), E = inst_end(&F); I != E; ++I) {
Instruction *Inst = &*I;
// If the terminator is an invoke marked with the
// clang.arc.no_objc_arc_exceptions metadata, the unwind edge can be
// ignored, for ARC purposes.
- if (isa<InvokeInst>(TI) && TI->getMetadata(NoObjCARCExceptionsMDKind))
+ if (isa<InvokeInst>(TI) && TI->getMetadata(NoObjCARCExceptionsMDKind)) {
+ DEBUG(dbgs() << "ObjCARCOpt::CheckForCFGHazards: Found an invoke "
+ "terminator marked with "
+ "clang.arc.no_objc_arc_exceptions. Ignoring unwind "
+ "edge.\n");
--SE;
+ }
for (; SI != SE; ++SI) {
Sequence SuccSSeq = S_None;
// If the terminator is an invoke marked with the
// clang.arc.no_objc_arc_exceptions metadata, the unwind edge can be
// ignored, for ARC purposes.
- if (isa<InvokeInst>(TI) && TI->getMetadata(NoObjCARCExceptionsMDKind))
+ if (isa<InvokeInst>(TI) && TI->getMetadata(NoObjCARCExceptionsMDKind)) {
+ DEBUG(dbgs() << "ObjCARCOpt::CheckForCFGHazards: Found an invoke "
+ "terminator marked with "
+ "clang.arc.no_objc_arc_exceptions. Ignoring unwind "
+ "edge.\n");
--SE;
+ }
for (; SI != SE; ++SI) {
Sequence SuccSSeq = S_None;
// Theoretically we could implement removal of nested retain+release
// pairs by making PtrState hold a stack of states, but this is
// simple and avoids adding overhead for the non-nested case.
- if (S.GetSeq() == S_Release || S.GetSeq() == S_MovableRelease)
+ if (S.GetSeq() == S_Release || S.GetSeq() == S_MovableRelease) {
+ DEBUG(dbgs() << "ObjCARCOpt::VisitInstructionBottomUp: Found nested "
+ "releases (i.e. a release pair)\n");
NestingDetected = true;
+ }
MDNode *ReleaseMetadata = Inst->getMetadata(ImpreciseReleaseMDKind);
S.ResetSequenceProgress(ReleaseMetadata ? S_MovableRelease : S_Release);
if (isa<InvokeInst>(Inst))
continue;
+ DEBUG(dbgs() << "ObjCARCOpt::VisitButtonUp: Visiting " << *Inst << "\n");
+
NestingDetected |= VisitInstructionBottomUp(Inst, BB, Retains, MyStates);
}
// Visit all the instructions, top-down.
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
Instruction *Inst = I;
+
+ DEBUG(dbgs() << "ObjCARCOpt::VisitTopDown: Visiting " << *Inst << "\n");
+
NestingDetected |= VisitInstructionTopDown(Inst, Releases, MyStates);
}
// If the terminator is an invoke marked with the
// clang.arc.no_objc_arc_exceptions metadata, the unwind edge can be
// ignored, for ARC purposes.
- if (isa<InvokeInst>(TI) && TI->getMetadata(NoObjCARCExceptionsMDKind))
+ if (isa<InvokeInst>(TI) && TI->getMetadata(NoObjCARCExceptionsMDKind)) {
+ DEBUG(dbgs() << "ObjCARCOpt::ComputePostOrders: Found an invoke "
+ "terminator marked with "
+ "clang.arc.no_objc_arc_exceptions. Ignoring unwind "
+ "edge.\n");
--SE;
+ }
while (SuccStack.back().second != SE) {
BasicBlock *SuccBB = *SuccStack.back().second++;