aboutsummaryrefslogtreecommitdiff
path: root/llvm/include/llvm/Support/KnownBits.h
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2021-07-29 20:15:26 +0000
committerDimitry Andric <dim@FreeBSD.org>2021-07-29 20:15:26 +0000
commit344a3780b2e33f6ca763666c380202b18aab72a3 (patch)
treef0b203ee6eb71d7fdd792373e3c81eb18d6934dd /llvm/include/llvm/Support/KnownBits.h
parentb60736ec1405bb0a8dd40989f67ef4c93da068ab (diff)
downloadsrc-344a3780b2e33f6ca763666c380202b18aab72a3.tar.gz
src-344a3780b2e33f6ca763666c380202b18aab72a3.zip
the upstream release/13.x branch was created.
Diffstat (limited to 'llvm/include/llvm/Support/KnownBits.h')
-rw-r--r--llvm/include/llvm/Support/KnownBits.h37
1 files changed, 22 insertions, 15 deletions
diff --git a/llvm/include/llvm/Support/KnownBits.h b/llvm/include/llvm/Support/KnownBits.h
index d854aadbd430..cfec5796493f 100644
--- a/llvm/include/llvm/Support/KnownBits.h
+++ b/llvm/include/llvm/Support/KnownBits.h
@@ -204,8 +204,13 @@ public:
/// tracking.
KnownBits sextInReg(unsigned SrcBitWidth) const;
- /// Return a KnownBits with the extracted bits
- /// [bitPosition,bitPosition+numBits).
+ /// Insert the bits from a smaller known bits starting at bitPosition.
+ void insertBits(const KnownBits &SubBits, unsigned BitPosition) {
+ Zero.insertBits(SubBits.Zero, BitPosition);
+ One.insertBits(SubBits.One, BitPosition);
+ }
+
+ /// Return a subset of the known bits from [bitPosition,bitPosition+numBits).
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const {
return KnownBits(Zero.extractBits(NumBits, BitPosition),
One.extractBits(NumBits, BitPosition));
@@ -285,6 +290,11 @@ public:
return KnownBits(LHS.Zero & RHS.Zero, LHS.One & RHS.One);
}
+ /// Return true if LHS and RHS have no common bits set.
+ static bool haveNoCommonBitsSet(const KnownBits &LHS, const KnownBits &RHS) {
+ return (LHS.Zero | RHS.Zero).isAllOnesValue();
+ }
+
/// Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
static KnownBits computeForAddCarry(
const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry);
@@ -294,7 +304,13 @@ public:
KnownBits RHS);
/// Compute known bits resulting from multiplying LHS and RHS.
- static KnownBits computeForMul(const KnownBits &LHS, const KnownBits &RHS);
+ static KnownBits mul(const KnownBits &LHS, const KnownBits &RHS);
+
+ /// Compute known bits from sign-extended multiply-hi.
+ static KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS);
+
+ /// Compute known bits from zero-extended multiply-hi.
+ static KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS);
/// Compute known bits for udiv(LHS, RHS).
static KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS);
@@ -359,18 +375,6 @@ public:
/// Determine if these known bits always give the same ICMP_SLE result.
static Optional<bool> sle(const KnownBits &LHS, const KnownBits &RHS);
- /// Insert the bits from a smaller known bits starting at bitPosition.
- void insertBits(const KnownBits &SubBits, unsigned BitPosition) {
- Zero.insertBits(SubBits.Zero, BitPosition);
- One.insertBits(SubBits.One, BitPosition);
- }
-
- /// Return a subset of the known bits from [bitPosition,bitPosition+numBits).
- KnownBits extractBits(unsigned NumBits, unsigned BitPosition) {
- return KnownBits(Zero.extractBits(NumBits, BitPosition),
- One.extractBits(NumBits, BitPosition));
- }
-
/// Update known bits based on ANDing with RHS.
KnownBits &operator&=(const KnownBits &RHS);
@@ -390,6 +394,9 @@ public:
KnownBits reverseBits() {
return KnownBits(Zero.reverseBits(), One.reverseBits());
}
+
+ void print(raw_ostream &OS) const;
+ void dump() const;
};
inline KnownBits operator&(KnownBits LHS, const KnownBits &RHS) {