From 10a18d55ce457b3fd1a045105f40a1dbb7f58054 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 12 Aug 2011 00:36:31 +0000 Subject: Don't convert objc_autoreleaseReturnValue to objc_autorelease if the result is returned through a bitcast. llvm-svn: 137402 --- llvm/lib/Transforms/Scalar/ObjCARC.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'llvm/lib/Transforms/Scalar/ObjCARC.cpp') diff --git a/llvm/lib/Transforms/Scalar/ObjCARC.cpp b/llvm/lib/Transforms/Scalar/ObjCARC.cpp index f2cda41c976..c74c353e81a 100644 --- a/llvm/lib/Transforms/Scalar/ObjCARC.cpp +++ b/llvm/lib/Transforms/Scalar/ObjCARC.cpp @@ -1925,12 +1925,19 @@ void ObjCARCOpt::OptimizeAutoreleaseRVCall(Function &F, Instruction *AutoreleaseRV) { // Check for a return of the pointer value. const Value *Ptr = GetObjCArg(AutoreleaseRV); - for (Value::const_use_iterator UI = Ptr->use_begin(), UE = Ptr->use_end(); - UI != UE; ++UI) { - const User *I = *UI; - if (isa(I) || GetBasicInstructionClass(I) == IC_RetainRV) - return; - } + SmallVector Users; + Users.push_back(Ptr); + do { + Ptr = Users.pop_back_val(); + for (Value::const_use_iterator UI = Ptr->use_begin(), UE = Ptr->use_end(); + UI != UE; ++UI) { + const User *I = *UI; + if (isa(I) || GetBasicInstructionClass(I) == IC_RetainRV) + return; + if (isa(I)) + Users.push_back(I); + } + } while (!Users.empty()); Changed = true; ++NumPeeps; -- cgit v1.2.3