mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
We ignore calls to ArraySemantic functions when we hoist uniqueness checks. With +0 self, this is disrupted by the release that now is in the caller instead of the callee. This patch fixes that problem by teaching COWArrayOpts about "guaranteed call sequences". This is the following pattern: retain(x) ... nothing that decrements reference counts ... call f1(@guaranteed_self x) ... nothing that decrements or uses ref counts ... call f2(@guaranteed_self x) ... nothing that decrements or uses ref counts ... ... ... nothing that decrements or uses ref counts ... call f$(n-1)(@guaranteed_self x) ... nothing that decrements or uses ref counts ... call fn(@guaranteed_self x) ... nothing that uses ref counts ... release(x) This pattern is created when there are a bunch of guaranteed calls together in a row (which seems to happen at the "semantic" SIL level). We pattern match the sequence and then verify that all of the calls are semantic calls. If the verification succeeds, we can hoist the uniqueness check. rdar://20340699 Swift SVN r26835
17 KiB
17 KiB