<div dir="ltr">Fixed bmiintrin.h in r221065. Thanks for pointing it out. I also added the Intel documented names for these intrinsics in r221066.</div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Nov 1, 2014 at 3:47 PM, Robinson, Paul <span dir="ltr"><<a href="mailto:Paul_Robinson@playstation.sony.com" target="_blank">Paul_Robinson@playstation.sony.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thanks.  I've been trying to do this today but having trouble getting to<br>
my work systems from home.<br>
<br>
Are there __builtin_ctz* calls (in bmiintrin.h or whatever) that assume they<br>
have tzcnt, and are also missing guards?<br>
--paulr<br>
<br>
> -----Original Message-----<br>
> From: <a href="mailto:cfe-commits-bounces@cs.uiuc.edu">cfe-commits-bounces@cs.uiuc.edu</a> [mailto:<a href="mailto:cfe-commits-">cfe-commits-</a><br>
> <a href="mailto:bounces@cs.uiuc.edu">bounces@cs.uiuc.edu</a>] On Behalf Of Craig Topper<br>
> Sent: Saturday, November 01, 2014 3:25 PM<br>
> To: <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> Subject: r221064 - Avoid undefined behavior in the x86 lzcnt header file<br>
> by explicitly checking for 0 before calling __builtin_clz. Without this<br>
> the optimizers may take advantage of the undefined behavior and produce<br>
> incorrect results. LLVM itself still needs t...<br>
><br>
> Author: ctopper<br>
> Date: Sat Nov  1 17:25:23 2014<br>
> New Revision: 221064<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=221064&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=221064&view=rev</a><br>
> Log:<br>
> Avoid undefined behavior in the x86 lzcnt header file by explicitly<br>
> checking for 0 before calling __builtin_clz. Without this the optimizers<br>
> may take advantage of the undefined behavior and produce incorrect<br>
> results. LLVM itself still needs to be taught to merge the zero check into<br>
> the llvm.ctlz with defined zero behavior.<br>
><br>
> Modified:<br>
>     cfe/trunk/lib/Headers/lzcntintrin.h<br>
><br>
> Modified: cfe/trunk/lib/Headers/lzcntintrin.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-" target="_blank">http://llvm.org/viewvc/llvm-</a><br>
> project/cfe/trunk/lib/Headers/lzcntintrin.h?rev=221064&r1=221063&r2=221064<br>
> &view=diff<br>
> ==========================================================================<br>
> ====<br>
> --- cfe/trunk/lib/Headers/lzcntintrin.h (original)<br>
> +++ cfe/trunk/lib/Headers/lzcntintrin.h Sat Nov  1 17:25:23 2014<br>
> @@ -35,20 +35,20 @@<br>
>  static __inline__ unsigned short __attribute__((__always_inline__,<br>
> __nodebug__))<br>
>  __lzcnt16(unsigned short __X)<br>
>  {<br>
> -  return __builtin_clzs(__X);<br>
> +  return __X ? __builtin_clzs(__X) : 16;<br>
>  }<br>
><br>
>  static __inline__ unsigned int __attribute__((__always_inline__,<br>
> __nodebug__))<br>
>  __lzcnt32(unsigned int __X)<br>
>  {<br>
> -  return __builtin_clz(__X);<br>
> +  return __X ? __builtin_clz(__X) : 32;<br>
>  }<br>
><br>
>  #ifdef __x86_64__<br>
>  static __inline__ unsigned long long __attribute__((__always_inline__,<br>
> __nodebug__))<br>
>  __lzcnt64(unsigned long long __X)<br>
>  {<br>
> -  return __builtin_clzll(__X);<br>
> +  return __X ? __builtin_clzll(__X) : 64;<br>
>  }<br>
>  #endif<br>
><br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>~Craig
</div>