<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><br><div><div>On Feb 12, 2014, at 9:54 , Kyle Sluder <<a href="mailto:kyle@ksluder.com">kyle@ksluder.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><meta http-equiv="content-type" content="text/html; charset=utf-8"><div dir="auto"><div>On Feb 12, 2014, at 9:23 AM, Jordan Rose <<a href="mailto:jordan_rose@apple.com">jordan_rose@apple.com</a>> wrote:</div><div><br></div><blockquote type="cite"><meta http-equiv="Content-Type" content="text/html charset=us-ascii"><div>Hi, Kyle. It looks like Clang does not perform this optimization, even under -O3 or -Oz. I can guess why: even though sending a message to nil will result in 0, it's still more work to call objc_msgSend, have <i>it</i> do the comparison to nil, and then have it clean things up properly to return 0. (In fact, you can poke at the <a href="http://www.opensource.apple.com/source/objc4/objc4-532.2/runtime/Messengers.subproj/objc-msg-x86_64.s">source</a> for objc_msgSend and see exactly how much work it is: not much, but still more than doing the check yourself.)</div></blockquote><div><br></div><div>Understood. Though I’m curious: is there a hard-and-fast rule against optimizations introducing function calls and/or branches where they would otherwise not appear?</div><div><br></div><div>Nonetheless, this optimization also introduces the possibility of involving the nil message handler (which AFAIK is undocumented), so there is a semantic difference as well as a performance difference.</div></div></blockquote></div><br><div>I didn't want to muddy the situation, but yes, that is exactly a case where messaging nil will not be equivalent. That might actually mean you'd end up having to hide your optimization behind a flag. Since the custom nil receiver is so rare, though, it might be okay to be on by default. (Can you tell that's not my area of the compiler? :-) )</div><div><br></div><div>Jordan</div></body></html>