diff options
author | Michael Gottesman <mgottesman@apple.com> | 2013-01-13 07:47:32 +0000 |
---|---|---|
committer | Michael Gottesman <mgottesman@apple.com> | 2013-01-13 07:47:32 +0000 |
commit | 1a89fe554b5a1bc65662547db62a888b6fa0d05f (patch) | |
tree | cfabc4a65161e2c96447c2bf8cec0a168151aa80 /llvm/lib/Transforms | |
parent | af2113ffb549916c7524815d0e7d1175a841c97c (diff) | |
download | bcm5719-llvm-1a89fe554b5a1bc65662547db62a888b6fa0d05f.tar.gz bcm5719-llvm-1a89fe554b5a1bc65662547db62a888b6fa0d05f.zip |
[ObjCARC] Even more debug messages!
llvm-svn: 172347
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/ObjCARC.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/ObjCARC.cpp b/llvm/lib/Transforms/Scalar/ObjCARC.cpp index 37af1f5affd..794d354ed6d 100644 --- a/llvm/lib/Transforms/Scalar/ObjCARC.cpp +++ b/llvm/lib/Transforms/Scalar/ObjCARC.cpp @@ -619,14 +619,23 @@ static bool ModuleHasARC(const Module &M) { /// escape analysis in that a use as an argument to a call is not considered /// an escape. static bool DoesObjCBlockEscape(const Value *BlockPtr) { + + DEBUG(dbgs() << "DoesObjCBlockEscape: Target: " << *BlockPtr << "\n"); + // Walk the def-use chains. SmallVector<const Value *, 4> Worklist; Worklist.push_back(BlockPtr); do { const Value *V = Worklist.pop_back_val(); + + DEBUG(dbgs() << "DoesObjCBlockEscape: Visiting: " << *V << "\n"); + for (Value::const_use_iterator UI = V->use_begin(), UE = V->use_end(); UI != UE; ++UI) { const User *UUser = *UI; + + DEBUG(dbgs() << "DoesObjCBlockEscape: User: " << *UUser << "\n"); + // Special - Use by a call (callee or argument) is not considered // to be an escape. switch (GetBasicInstructionClass(UUser)) { @@ -634,15 +643,20 @@ static bool DoesObjCBlockEscape(const Value *BlockPtr) { case IC_InitWeak: case IC_StoreStrong: case IC_Autorelease: - case IC_AutoreleaseRV: + case IC_AutoreleaseRV: { + DEBUG(dbgs() << "DoesObjCBlockEscape: User copies pointer arguments. " + "Block Escapes!\n"); // These special functions make copies of their pointer arguments. return true; + } case IC_User: case IC_None: // Use by an instruction which copies the value is an escape if the // result is an escape. if (isa<BitCastInst>(UUser) || isa<GetElementPtrInst>(UUser) || isa<PHINode>(UUser) || isa<SelectInst>(UUser)) { + DEBUG(dbgs() << "DoesObjCBlockEscape: User copies value. Escapes if " + "result escapes. Adding to list.\n"); Worklist.push_back(UUser); continue; } @@ -659,11 +673,13 @@ static bool DoesObjCBlockEscape(const Value *BlockPtr) { continue; } // Otherwise, conservatively assume an escape. + DEBUG(dbgs() << "DoesObjCBlockEscape: Assuming block escapes.\n"); return true; } } while (!Worklist.empty()); // No escapes found. + DEBUG(dbgs() << "DoesObjCBlockEscape: Block does not escape.\n"); return false; } |