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