[PATCH] D71682: Relax the rules around objc_alloc and objc_alloc_init optimizations.

Pierre Habouzit via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 18 17:31:09 PST 2019


MadCoder created this revision.
MadCoder added reviewers: rjmccall, arphaman, erik.pilkington, ahatanak.
MadCoder added a project: clang.
Herald added subscribers: cfe-commits, dexonsmith.
MadCoder edited the summary of this revision.

Today the optimization is limited to:

- `[ClassName alloc]`
- `[self alloc] when within a class method`

However it means that when code is written this way:

  @interface MyObject
  - (id)copyWithZone:(NSZone *)zone
  {
      return [[self.class alloc] _initWith...];
  }
  @end

... then the optimization doesn't kick in and +[NSObject alloc] ends up in IMP caches where it could have been avoided.

It turns out that +alloc -> +[NSObject alloc] is the most cached SEL/IMP pair in the entire platform which is rather silly).

There's two theoretical risks allowing this optimization:

1. if the receiver is nil (which it can't be today), but it turns out that objc_alloc()/objc_alloc_init() cope with a nil receiver,
2. if the `Class` type for the receiver is a lie. However, for such a code to work today (and not fail witn an unrecognized selector anyway) you'd have to have implemented the -alloc *instance method*.

  Fortunately, objc_alloc() doesn't assume that the receiver is a Class, it basically starts with a test that is similar to `if (receiver->isa->bits & hasDefaultAWZ) { /* fastpath */ }`. This bit is only set on metaclasses by the runtime, so if an instance is passed to this function by accident, its isa will fail this test, and objc_alloc() will gracefully fallback to objc_msgSend().

  The one thing objc_alloc() doesn't support is tagged pointer instances. None of the tagged pointer classes implement an instance method called 'alloc' (actually there's a single class in the entire Apple codebase that has such a method).

Radar-Id: rdar://problem/58058316


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71682

Files:
  clang/lib/CodeGen/CGObjC.cpp
  clang/test/CodeGenObjC/objc-alloc-init.m

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D71682.234644.patch
Type: text/x-patch
Size: 3724 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20191219/324df68a/attachment.bin>


More information about the cfe-commits mailing list