From 11c06ea55a060d5460f716b00ca593e5dd829b17 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Sat, 24 Sep 2016 21:01:20 +0000 Subject: [PATCH] ObjCARC: Don't look at users of ConstantData Stop looking at users of UndefValue and ConstantPointerNull in the objective C ARC optimizers. The other users aren't actually interesting, since they're not pointing at a particular object. I imagine these calls could be optimized through -instcombine... maybe they already are? These early returns will be required at some point in the future, with a WIP patch that asserts when someone accesses a use-list on ConstantData. llvm-svn: 282338 --- llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp index a6907b5..ed5063c 100644 --- a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp +++ b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp @@ -53,6 +53,11 @@ using namespace llvm::objcarc; /// \brief This is similar to GetRCIdentityRoot but it stops as soon /// as it finds a value with multiple uses. static const Value *FindSingleUseIdentifiedObject(const Value *Arg) { + // ConstantData (like ConstantPointerNull and UndefValue) is used across + // modules. It's never a single-use value. + if (isa(Arg)) + return nullptr; + if (Arg->hasOneUse()) { if (const BitCastInst *BC = dyn_cast(Arg)) return FindSingleUseIdentifiedObject(BC->getOperand(0)); @@ -644,6 +649,12 @@ void ObjCARCOpt::OptimizeAutoreleaseRVCall(Function &F, ARCInstKind &Class) { // Check for a return of the pointer value. const Value *Ptr = GetArgRCIdentityRoot(AutoreleaseRV); + + // If the argument is ConstantPointerNull or UndefValue, its other users + // aren't actually interesting to look at. + if (isa(Ptr)) + return; + SmallVector Users; Users.push_back(Ptr); do { -- 2.7.4