mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[KnownBits] Add KnownBits::haveNoCommonBitsSet helper. NFCI.
Include exhaustive test coverage.
This commit is contained in:
parent
96cc3dc1e4
commit
cad94dd97b
@ -285,6 +285,11 @@ public:
|
|||||||
return KnownBits(LHS.Zero & RHS.Zero, LHS.One & RHS.One);
|
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.
|
/// Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
|
||||||
static KnownBits computeForAddCarry(
|
static KnownBits computeForAddCarry(
|
||||||
const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry);
|
const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry);
|
||||||
|
@ -301,7 +301,7 @@ bool llvm::haveNoCommonBitsSet(const Value *LHS, const Value *RHS,
|
|||||||
KnownBits RHSKnown(IT->getBitWidth());
|
KnownBits RHSKnown(IT->getBitWidth());
|
||||||
computeKnownBits(LHS, LHSKnown, DL, 0, AC, CxtI, DT, nullptr, UseInstrInfo);
|
computeKnownBits(LHS, LHSKnown, DL, 0, AC, CxtI, DT, nullptr, UseInstrInfo);
|
||||||
computeKnownBits(RHS, RHSKnown, DL, 0, AC, CxtI, DT, nullptr, UseInstrInfo);
|
computeKnownBits(RHS, RHSKnown, DL, 0, AC, CxtI, DT, nullptr, UseInstrInfo);
|
||||||
return (LHSKnown.Zero | RHSKnown.Zero).isAllOnesValue();
|
return KnownBits::haveNoCommonBitsSet(LHSKnown, RHSKnown);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool llvm::isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI) {
|
bool llvm::isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI) {
|
||||||
|
@ -4351,7 +4351,8 @@ bool SelectionDAG::isEqualTo(SDValue A, SDValue B) const {
|
|||||||
bool SelectionDAG::haveNoCommonBitsSet(SDValue A, SDValue B) const {
|
bool SelectionDAG::haveNoCommonBitsSet(SDValue A, SDValue B) const {
|
||||||
assert(A.getValueType() == B.getValueType() &&
|
assert(A.getValueType() == B.getValueType() &&
|
||||||
"Values must have the same type");
|
"Values must have the same type");
|
||||||
return (computeKnownBits(A).Zero | computeKnownBits(B).Zero).isAllOnesValue();
|
return KnownBits::haveNoCommonBitsSet(computeKnownBits(A),
|
||||||
|
computeKnownBits(B));
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
|
static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
|
||||||
|
@ -463,4 +463,20 @@ TEST(KnownBitsTest, SExtInReg) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(KnownBitsTest, CommonBitsSet) {
|
||||||
|
unsigned Bits = 4;
|
||||||
|
ForeachKnownBits(Bits, [&](const KnownBits &Known1) {
|
||||||
|
ForeachKnownBits(Bits, [&](const KnownBits &Known2) {
|
||||||
|
bool HasCommonBitsSet = false;
|
||||||
|
ForeachNumInKnownBits(Known1, [&](const APInt &N1) {
|
||||||
|
ForeachNumInKnownBits(Known2, [&](const APInt &N2) {
|
||||||
|
HasCommonBitsSet |= N1.intersects(N2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
EXPECT_EQ(!HasCommonBitsSet,
|
||||||
|
KnownBits::haveNoCommonBitsSet(Known1, Known2));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
} // end anonymous namespace
|
} // end anonymous namespace
|
||||||
|
Loading…
Reference in New Issue
Block a user