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)
llvm-svn: 221064

clang/lib/Headers/lzcntintrin.h

index 62ab5ca..5bb7435 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