mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-29 08:31:13 +00:00
[KnownBits] Add KnownBits::commonBits helper. NFCI.
We have a frequent pattern where we're merging two KnownBits to get the common/shared bits, and I just fell for the gotcha where I tried to use the & operator to merge them........
This commit is contained in:
parent
c2a7d9f317
commit
1a62ca65c1
@ -250,6 +250,11 @@ public:
|
||||
return getBitWidth() - Zero.countPopulation();
|
||||
}
|
||||
|
||||
/// Compute known bits common to LHS and RHS.
|
||||
static KnownBits commonBits(const KnownBits &LHS, const KnownBits &RHS) {
|
||||
return KnownBits(LHS.Zero & RHS.Zero, LHS.One & RHS.One);
|
||||
}
|
||||
|
||||
/// 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);
|
||||
|
@ -1160,8 +1160,7 @@ static void computeKnownBitsFromOperator(const Operator *I,
|
||||
computeKnownBits(I->getOperand(1), Known2, Depth + 1, Q);
|
||||
|
||||
// Only known if known in both the LHS and RHS.
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
|
||||
if (SPF == SPF_ABS) {
|
||||
// RHS from matchSelectPattern returns the negation part of abs pattern.
|
||||
@ -1515,11 +1514,10 @@ static void computeKnownBitsFromOperator(const Operator *I,
|
||||
// Recurse, but cap the recursion to one level, because we don't
|
||||
// want to waste time spinning around in loops.
|
||||
computeKnownBits(IncValue, Known2, MaxAnalysisRecursionDepth - 1, RecQ);
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known.One &= Known2.One;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
// If all bits have been ruled out, there's no need to check
|
||||
// more operands.
|
||||
if (!Known.Zero && !Known.One)
|
||||
if (Known.isUnknown())
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1710,8 +1708,7 @@ static void computeKnownBitsFromOperator(const Operator *I,
|
||||
if (!!DemandedRHS) {
|
||||
const Value *RHS = Shuf->getOperand(1);
|
||||
computeKnownBits(RHS, DemandedRHS, Known2, Depth + 1, Q);
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1740,8 +1737,7 @@ static void computeKnownBitsFromOperator(const Operator *I,
|
||||
DemandedVecElts.clearBit(EltIdx);
|
||||
if (!!DemandedVecElts) {
|
||||
computeKnownBits(Vec, DemandedVecElts, Known2, Depth + 1, Q);
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -110,8 +110,7 @@ void GISelKnownBits::computeKnownBitsMin(Register Src0, Register Src1,
|
||||
computeKnownBitsImpl(Src0, Known2, DemandedElts, Depth);
|
||||
|
||||
// Only known if known in both the LHS and RHS.
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known.One &= Known2.One;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
}
|
||||
|
||||
void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known,
|
||||
@ -201,8 +200,7 @@ void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known,
|
||||
// For COPYs we don't do anything, don't increase the depth.
|
||||
computeKnownBitsImpl(SrcReg, Known2, DemandedElts,
|
||||
Depth + (Opcode != TargetOpcode::COPY));
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
// If we reach a point where we don't know anything
|
||||
// just stop looking through the operands.
|
||||
if (Known.One == 0 && Known.Zero == 0)
|
||||
|
@ -2667,8 +2667,7 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
|
||||
}
|
||||
|
||||
// Known bits are the values that are shared by every demanded element.
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
|
||||
// If we don't know any bits, early out.
|
||||
if (Known.isUnknown())
|
||||
@ -2705,8 +2704,7 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
|
||||
if (!!DemandedLHS) {
|
||||
SDValue LHS = Op.getOperand(0);
|
||||
Known2 = computeKnownBits(LHS, DemandedLHS, Depth + 1);
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
}
|
||||
// If we don't know any bits, early out.
|
||||
if (Known.isUnknown())
|
||||
@ -2714,8 +2712,7 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
|
||||
if (!!DemandedRHS) {
|
||||
SDValue RHS = Op.getOperand(1);
|
||||
Known2 = computeKnownBits(RHS, DemandedRHS, Depth + 1);
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -2731,8 +2728,7 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
|
||||
if (!!DemandedSub) {
|
||||
SDValue Sub = Op.getOperand(i);
|
||||
Known2 = computeKnownBits(Sub, DemandedSub, Depth + 1);
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
}
|
||||
// If we don't know any bits, early out.
|
||||
if (Known.isUnknown())
|
||||
@ -2760,8 +2756,7 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
|
||||
}
|
||||
if (!!DemandedSrcElts) {
|
||||
Known2 = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -2898,8 +2893,7 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
|
||||
Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth+1);
|
||||
|
||||
// Only known if known in both the LHS and RHS.
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
break;
|
||||
case ISD::SELECT_CC:
|
||||
Known = computeKnownBits(Op.getOperand(3), DemandedElts, Depth+1);
|
||||
@ -2909,8 +2903,7 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
|
||||
Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
|
||||
|
||||
// Only known if known in both the LHS and RHS.
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
break;
|
||||
case ISD::SMULO:
|
||||
case ISD::UMULO:
|
||||
@ -3321,13 +3314,11 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
|
||||
Known.Zero.setAllBits();
|
||||
if (DemandedVal) {
|
||||
Known2 = computeKnownBits(InVal, Depth + 1);
|
||||
Known.One &= Known2.One.zextOrTrunc(BitWidth);
|
||||
Known.Zero &= Known2.Zero.zextOrTrunc(BitWidth);
|
||||
Known = KnownBits::commonBits(Known, Known2.zextOrTrunc(BitWidth));
|
||||
}
|
||||
if (!!DemandedVecElts) {
|
||||
Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -110,7 +110,7 @@ KnownBits KnownBits::umax(const KnownBits &LHS, const KnownBits &RHS) {
|
||||
// are common to these two values are also known in the result.
|
||||
KnownBits L = LHS.makeGE(RHS.getMinValue());
|
||||
KnownBits R = RHS.makeGE(LHS.getMinValue());
|
||||
return KnownBits(L.Zero & R.Zero, L.One & R.One);
|
||||
return KnownBits::commonBits(L, R);
|
||||
}
|
||||
|
||||
KnownBits KnownBits::umin(const KnownBits &LHS, const KnownBits &RHS) {
|
||||
|
@ -1472,8 +1472,7 @@ void AArch64TargetLowering::computeKnownBitsForTargetNode(
|
||||
KnownBits Known2;
|
||||
Known = DAG.computeKnownBits(Op->getOperand(0), Depth + 1);
|
||||
Known2 = DAG.computeKnownBits(Op->getOperand(1), Depth + 1);
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known.One &= Known2.One;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
break;
|
||||
}
|
||||
case AArch64ISD::LOADgot:
|
||||
|
@ -17422,8 +17422,7 @@ void ARMTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
|
||||
return;
|
||||
|
||||
KnownBits KnownRHS = DAG.computeKnownBits(Op.getOperand(1), Depth+1);
|
||||
Known.Zero &= KnownRHS.Zero;
|
||||
Known.One &= KnownRHS.One;
|
||||
Known = KnownBits::commonBits(Known, KnownRHS);
|
||||
return;
|
||||
}
|
||||
case ISD::INTRINSIC_W_CHAIN: {
|
||||
|
@ -1500,8 +1500,7 @@ void LanaiTargetLowering::computeKnownBitsForTargetNode(
|
||||
KnownBits Known2;
|
||||
Known = DAG.computeKnownBits(Op->getOperand(0), Depth + 1);
|
||||
Known2 = DAG.computeKnownBits(Op->getOperand(1), Depth + 1);
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known.One &= Known2.One;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1877,8 +1877,7 @@ void SparcTargetLowering::computeKnownBitsForTargetNode
|
||||
Known2 = DAG.computeKnownBits(Op.getOperand(0), Depth + 1);
|
||||
|
||||
// Only known if known in both the LHS and RHS.
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -6817,8 +6817,7 @@ static void computeKnownBitsBinOp(const SDValue Op, KnownBits &Known,
|
||||
DAG.computeKnownBits(Op.getOperand(OpNo), Src0DemE, Depth + 1);
|
||||
KnownBits RHSKnown =
|
||||
DAG.computeKnownBits(Op.getOperand(OpNo + 1), Src1DemE, Depth + 1);
|
||||
Known.Zero = LHSKnown.Zero & RHSKnown.Zero;
|
||||
Known.One = LHSKnown.One & RHSKnown.One;
|
||||
Known = KnownBits::commonBits(LHSKnown, RHSKnown);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -34108,13 +34108,11 @@ void X86TargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
|
||||
KnownBits Known2;
|
||||
if (!!DemandedLHS) {
|
||||
Known2 = DAG.computeKnownBits(Op.getOperand(0), DemandedLHS, Depth + 1);
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
}
|
||||
if (!!DemandedRHS) {
|
||||
Known2 = DAG.computeKnownBits(Op.getOperand(1), DemandedRHS, Depth + 1);
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
}
|
||||
|
||||
if (Known.countMinLeadingZeros() < BitWidth)
|
||||
@ -34157,8 +34155,7 @@ void X86TargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
|
||||
KnownBits Known2 = DAG.computeKnownBits(Op.getOperand(0), Depth + 1);
|
||||
|
||||
// Only known if known in both the LHS and RHS.
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
break;
|
||||
}
|
||||
case X86ISD::BEXTR:
|
||||
@ -34300,8 +34297,7 @@ void X86TargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
|
||||
continue;
|
||||
KnownBits Known2 =
|
||||
DAG.computeKnownBits(Ops[i], DemandedOps[i], Depth + 1);
|
||||
Known.One &= Known2.One;
|
||||
Known.Zero &= Known2.Zero;
|
||||
Known = KnownBits::commonBits(Known, Known2);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -38410,8 +38406,7 @@ bool X86TargetLowering::SimplifyDemandedBitsForTargetNode(
|
||||
return true;
|
||||
|
||||
KnownScl = KnownScl.trunc(VecVT.getScalarSizeInBits());
|
||||
Known.One = KnownVec.One & KnownScl.One;
|
||||
Known.Zero = KnownVec.Zero & KnownScl.Zero;
|
||||
Known = KnownBits::commonBits(KnownVec, KnownScl);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
@ -367,8 +367,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
|
||||
return I;
|
||||
|
||||
// Only known if known in both the LHS and RHS.
|
||||
Known.One = RHSKnown.One & LHSKnown.One;
|
||||
Known.Zero = RHSKnown.Zero & LHSKnown.Zero;
|
||||
Known = KnownBits::commonBits(LHSKnown, RHSKnown);
|
||||
break;
|
||||
}
|
||||
case Instruction::ZExt:
|
||||
|
Loading…
Reference in New Issue
Block a user