aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2015-04-10 22:58:48 +0000
committerTim Northover <tnorthover@apple.com>2015-04-10 22:58:48 +0000
commit1290047a7d70b304114127dbcabe5f79dbca325e (patch)
tree233138ba8363bfccda78ab948ec21cd6297c0740
parent8106a264d37d2f04423a69250be5cbda0e21ec9c (diff)
downloadllvm-1290047a7d70b304114127dbcabe5f79dbca325e.zip
llvm-1290047a7d70b304114127dbcabe5f79dbca325e.tar.gz
llvm-1290047a7d70b304114127dbcabe5f79dbca325e.tar.bz2
Generic: Make isMask_N and isShiftedMask_N consistent over 0
Previously, isMask_N returned false for 0 but isShiftedMask_N returned true. Almost all uses are for pattern matching bitfield operations in the backends, and expect false (this was discovered because of AArch64's copy of this logic). Unfortunately, I couldn't put together a small non-fragile test for this. The nature of the bitfield operations means that this edge case is only really triggered for nodes like "(and N, 0)", which the DAG combiner is usually very good at folding away before they get to this stage. rdar://20501377 llvm-svn: 234659
-rw-r--r--llvm/include/llvm/Support/MathExtras.h20
1 files changed, 10 insertions, 10 deletions
diff --git a/llvm/include/llvm/Support/MathExtras.h b/llvm/include/llvm/Support/MathExtras.h
index 388d82c..7edc2ac 100644
--- a/llvm/include/llvm/Support/MathExtras.h
+++ b/llvm/include/llvm/Support/MathExtras.h
@@ -318,31 +318,31 @@ inline bool isIntN(unsigned N, int64_t x) {
return N >= 64 || (-(INT64_C(1)<<(N-1)) <= x && x < (INT64_C(1)<<(N-1)));
}
-/// isMask_32 - This function returns true if the argument is a sequence of ones
-/// starting at the least significant bit with the remainder zero (32 bit
-/// version). Ex. isMask_32(0x0000FFFFU) == true.
+/// isMask_32 - This function returns true if the argument is a non-empty
+/// sequence of ones starting at the least significant bit with the remainder
+/// zero (32 bit version). Ex. isMask_32(0x0000FFFFU) == true.
inline bool isMask_32(uint32_t Value) {
return Value && ((Value + 1) & Value) == 0;
}
-/// isMask_64 - This function returns true if the argument is a sequence of ones
-/// starting at the least significant bit with the remainder zero (64 bit
-/// version).
+/// isMask_64 - This function returns true if the argument is a non-empty
+/// sequence of ones starting at the least significant bit with the remainder
+/// zero (64 bit version).
inline bool isMask_64(uint64_t Value) {
return Value && ((Value + 1) & Value) == 0;
}
/// isShiftedMask_32 - This function returns true if the argument contains a
-/// sequence of ones with the remainder zero (32 bit version.)
+/// non-empty sequence of ones with the remainder zero (32 bit version.)
/// Ex. isShiftedMask_32(0x0000FF00U) == true.
inline bool isShiftedMask_32(uint32_t Value) {
- return isMask_32((Value - 1) | Value);
+ return Value && isMask_32((Value - 1) | Value);
}
/// isShiftedMask_64 - This function returns true if the argument contains a
-/// sequence of ones with the remainder zero (64 bit version.)
+/// non-empty sequence of ones with the remainder zero (64 bit version.)
inline bool isShiftedMask_64(uint64_t Value) {
- return isMask_64((Value - 1) | Value);
+ return Value && isMask_64((Value - 1) | Value);
}
/// isPowerOf2_32 - This function returns true if the argument is a power of