summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/ObjCARC.cpp
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2011-08-12 00:36:31 +0000
committerDan Gohman <gohman@apple.com>2011-08-12 00:36:31 +0000
commit10a18d55ce457b3fd1a045105f40a1dbb7f58054 (patch)
tree721caa64d89be146d1a71cefffff9840f1024528 /llvm/lib/Transforms/Scalar/ObjCARC.cpp
parent9b25cee36f3be25b47c3e839432b445709b844ac (diff)
downloadbcm5719-llvm-10a18d55ce457b3fd1a045105f40a1dbb7f58054.tar.gz
bcm5719-llvm-10a18d55ce457b3fd1a045105f40a1dbb7f58054.zip
Don't convert objc_autoreleaseReturnValue to objc_autorelease if the result
is returned through a bitcast. llvm-svn: 137402
Diffstat (limited to 'llvm/lib/Transforms/Scalar/ObjCARC.cpp')
-rw-r--r--llvm/lib/Transforms/Scalar/ObjCARC.cpp19
1 files changed, 13 insertions, 6 deletions
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<ReturnInst>(I) || GetBasicInstructionClass(I) == IC_RetainRV)
- return;
- }
+ SmallVector<const Value *, 2> 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<ReturnInst>(I) || GetBasicInstructionClass(I) == IC_RetainRV)
+ return;
+ if (isa<BitCastInst>(I))
+ Users.push_back(I);
+ }
+ } while (!Users.empty());
Changed = true;
++NumPeeps;
OpenPOWER on IntegriCloud