<div class="gmail_quote">On Thu, Jan 26, 2012 at 2:14 PM, Bob Wilson <span dir="ltr"><<a href="mailto:bob.wilson@apple.com">bob.wilson@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div id=":419">Make clz/ctz builtins defined for zero on ARM targets.  rdar://10732455<br>
<br>
ARM supports clz and ctz directly and both operations have well-defined<br>
results for zero.  There is no disadvantage in performance to using the<br>
defined-at-zero versions of llvm.ctlz/cttz intrinsics.  We're running into<br>
ARM-specific code written with the assumption that __builtin_clz(0) == 32,<br>
even though that value is technically undefined.  The code is failing now<br>
because of llvm optimizations that are taking advantage of the undef<br>
behavior (specifically svn r147255).  There's nothing wrong with that<br>
optimization on x86 where any incorrect assumptions about __builtin_clz(0)<br>
will quickly be exposed.  For ARM, though, optimizations based on that undef<br>
behavior are likely to cause subtle bugs.  Other targets with defined-at-zero<br>
clz/ctz support may want to override the default behavior as well.</div></blockquote></div><br><div>Ouch. I can't argue at all with the logic here, but this is a nasty, nasty minefield.</div><div><br></div><div>I wonder, would it be better to add new builtins to represent defined-at-zero semantics consistently on all platforms? Maybe we could get folks to switch to those (or at least start).</div>
<div><br></div><div>Either way, please document this language extension really loudly, as it is a specific divergence from GCC's specification of the builtins, and the builtins are supposedly Clang providing a "faithful" emulation of GCC....</div>