]> granicus.if.org Git - clang/commitdiff
Avoid undefined behavior in the x86 lzcnt header file by explicitly checking for...
authorCraig Topper <craig.topper@gmail.com>
Sat, 1 Nov 2014 22:25:23 +0000 (22:25 +0000)
committerCraig Topper <craig.topper@gmail.com>
Sat, 1 Nov 2014 22:25:23 +0000 (22:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221064 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Headers/lzcntintrin.h

index 62ab5ca2f358061ffd6fb942c22ba8e60d02882c..5bb74355047f662b972d52d20c3fc97b29e8a105 100644 (file)
 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