diff options
Diffstat (limited to 'llvm/lib/Analysis/ObjCARCAnalysisUtils.cpp')
| -rw-r--r-- | llvm/lib/Analysis/ObjCARCAnalysisUtils.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ObjCARCAnalysisUtils.cpp b/llvm/lib/Analysis/ObjCARCAnalysisUtils.cpp index 56d1cb421225..d34a3c636362 100644 --- a/llvm/lib/Analysis/ObjCARCAnalysisUtils.cpp +++ b/llvm/lib/Analysis/ObjCARCAnalysisUtils.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Analysis/ObjCARCAnalysisUtils.h" +#include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Support/CommandLine.h" using namespace llvm; @@ -23,3 +24,22 @@ bool llvm::objcarc::EnableARCOpts; static cl::opt<bool, true> EnableARCOptimizations( "enable-objc-arc-opts", cl::desc("enable/disable all ARC Optimizations"), cl::location(EnableARCOpts), cl::init(true), cl::Hidden); + +bool llvm::objcarc::IsPotentialRetainableObjPtr(const Value *Op, + AAResults &AA) { + // First make the rudimentary check. + if (!IsPotentialRetainableObjPtr(Op)) + return false; + + // Objects in constant memory are not reference-counted. + if (AA.pointsToConstantMemory(Op)) + return false; + + // Pointers in constant memory are not pointing to reference-counted objects. + if (const LoadInst *LI = dyn_cast<LoadInst>(Op)) + if (AA.pointsToConstantMemory(LI->getPointerOperand())) + return false; + + // Otherwise assume the worst. + return true; +} |
