diff options
| author | Dan Gohman <gohman@apple.com> | 2011-08-22 17:29:11 +0000 |
|---|---|---|
| committer | Dan Gohman <gohman@apple.com> | 2011-08-22 17:29:11 +0000 |
| commit | 1b31ea8f935d4b643abf100c4943180c9ed8ba1a (patch) | |
| tree | 8bb82696cb508e2560a25e690512fc278350cedd /lib/Transforms | |
| parent | 986b865c03b04e9d65bd100c7254c58547fc89e7 (diff) | |
| download | external_llvm-1b31ea8f935d4b643abf100c4943180c9ed8ba1a.zip external_llvm-1b31ea8f935d4b643abf100c4943180c9ed8ba1a.tar.gz external_llvm-1b31ea8f935d4b643abf100c4943180c9ed8ba1a.tar.bz2 | |
Constant pointers to objects don't need reference counting.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138242 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
| -rw-r--r-- | lib/Transforms/Scalar/ObjCARC.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/ObjCARC.cpp b/lib/Transforms/Scalar/ObjCARC.cpp index fea03b5..9654b1e 100644 --- a/lib/Transforms/Scalar/ObjCARC.cpp +++ b/lib/Transforms/Scalar/ObjCARC.cpp @@ -515,6 +515,10 @@ static bool IsObjCIdentifiedObject(const Value *V) { const Value *Pointer = StripPointerCastsAndObjCCalls(LI->getPointerOperand()); if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(Pointer)) { + // A constant pointer can't be pointing to an object on the heap. It may + // be reference-counted, but it won't be deleted. + if (GV->isConstant()) + return true; StringRef Name = GV->getName(); // These special variables are known to hold values which are not // reference-counted pointers. @@ -2744,6 +2748,15 @@ ObjCARCOpt::PerformCodePlacement(DenseMap<const BasicBlock *, BBState> // regardless of what possible decrements or uses lie between them. bool KnownSafe = isa<Constant>(Arg) || isa<AllocaInst>(Arg); + // A constant pointer can't be pointing to an object on the heap. It may + // be reference-counted, but it won't be deleted. + if (const LoadInst *LI = dyn_cast<LoadInst>(Arg)) + if (const GlobalVariable *GV = + dyn_cast<GlobalVariable>( + StripPointerCastsAndObjCCalls(LI->getPointerOperand()))) + if (GV->isConstant()) + KnownSafe = true; + // If a pair happens in a region where it is known that the reference count // is already incremented, we can similarly ignore possible decrements. bool KnownSafeTD = true, KnownSafeBU = true; |
