From 315172f4cae76d5ef588616b8630cfaeec1bdcd9 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 --- lib/Transforms/ObjCARC/ObjCARCOpts.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/Transforms/ObjCARC/ObjCARCOpts.cpp b/lib/Transforms/ObjCARC/ObjCARCOpts.cpp index a6907b56cf4..ed5063cdf1a 100644 --- a/lib/Transforms/ObjCARC/ObjCARCOpts.cpp +++ b/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 {