Commits

Michael Gottesman committed 2c1aed9b27d
[cow] Teach uniqueness check hoisting how to ignore guaranteed calls to ArraySemantic functions. 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