[llvm] 12bdd42 - [APFloat] Improve asserts in isSignificandAllOnes and isSignificandAllZeros so they protect shift operations from undefined behavior.
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 30 19:33:09 PDT 2020
Author: Craig Topper
Date: 2020-09-30T19:32:34-07:00
New Revision: 12bdd427b33a75bd7abb5d4cb095d0b983328034
URL: https://github.com/llvm/llvm-project/commit/12bdd427b33a75bd7abb5d4cb095d0b983328034
DIFF: https://github.com/llvm/llvm-project/commit/12bdd427b33a75bd7abb5d4cb095d0b983328034.diff
LOG: [APFloat] Improve asserts in isSignificandAllOnes and isSignificandAllZeros so they protect shift operations from undefined behavior.
For example, the assert in isSignificandAllZeros allowed NumHighBits
to be integerPartWidth. But since it is used directly as a shift amount
it must be less than integerPartWidth.
Added:
Modified:
llvm/lib/Support/APFloat.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp
index c5adbe9cf746..58e49b5384cd 100644
--- a/llvm/lib/Support/APFloat.cpp
+++ b/llvm/lib/Support/APFloat.cpp
@@ -850,8 +850,8 @@ bool IEEEFloat::isSignificandAllOnes() const {
// Set the unused high bits to all ones when we compare.
const unsigned NumHighBits =
PartCount*integerPartWidth - semantics->precision + 1;
- assert(NumHighBits <= integerPartWidth && "Can not have more high bits to "
- "fill than integerPartWidth");
+ assert(NumHighBits <= integerPartWidth && NumHighBits > 0 &&
+ "Can not have more high bits to fill than integerPartWidth");
const integerPart HighBitFill =
~integerPart(0) << (integerPartWidth - NumHighBits);
if (~(Parts[PartCount - 1] | HighBitFill))
@@ -870,9 +870,10 @@ bool IEEEFloat::isSignificandAllZeros() const {
if (Parts[i])
return false;
+ // Compute how many bits are used in the final word.
const unsigned NumHighBits =
PartCount*integerPartWidth - semantics->precision + 1;
- assert(NumHighBits <= integerPartWidth && "Can not have more high bits to "
+ assert(NumHighBits < integerPartWidth && "Can not have more high bits to "
"clear than integerPartWidth");
const integerPart HighBitMask = ~integerPart(0) >> NumHighBits;
More information about the llvm-commits
mailing list