Avoid overflowing a signed integer which triggers undefined behaviour.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 6 Apr 2010 03:12:43 +0000 (03:12 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 6 Apr 2010 03:12:43 +0000 (03:12 +0000)
Overflowing an unsigned integer is fine and behaves as you would expect.
Also fix a pasto, allowing SignExtend64 to take a 64-bit argument.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100517 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/MathExtras.h

index f56241c5790b114882b65103ad10487128c9e3fe..80d11ae062f776630e9657765a0314fb62557801 100644 (file)
@@ -459,14 +459,14 @@ inline int64_t abs64(int64_t x) {
 
 /// SignExtend32 - Sign extend B-bit number x to 32-bit int.
 /// Usage int32_t r = SignExtend32<5>(x);
-template <unsigned B> inline int32_t SignExtend32(int32_t x) {
-  return (x << (32 - B)) >> (32 - B);
+template <unsigned B> inline int32_t SignExtend32(uint32_t x) {
+  return int32_t(x << (32 - B)) >> (32 - B);
 }
 
 /// SignExtend64 - Sign extend B-bit number x to 64-bit int.
 /// Usage int64_t r = SignExtend64<5>(x);
-template <unsigned B> inline int64_t SignExtend64(int32_t x) {
-  return (x << (64 - B)) >> (64 - B);
+template <unsigned B> inline int64_t SignExtend64(uint64_t x) {
+  return int64_t(x << (64 - B)) >> (64 - B);
 }
 
 } // End llvm namespace