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
This commit is contained in:
Duncan P. N. Exon Smith 2016-09-24 21:01:20 +00:00
parent 2f789947a5
commit 315172f4ca

View File

@ -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<ConstantData>(Arg))
return nullptr;
if (Arg->hasOneUse()) {
if (const BitCastInst *BC = dyn_cast<BitCastInst>(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<ConstantData>(Ptr))
return;
SmallVector<const Value *, 2> Users;
Users.push_back(Ptr);
do {