@@ -38487,11 +38487,17 @@ void X86TargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
3848738487 Known.Zero |= Known2.One;
3848838488 break;
3848938489 }
38490+ case X86ISD::FAND: {
38491+ KnownBits Known2;
38492+ Known = DAG.computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
38493+ Known2 = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
38494+ Known &= Known2;
38495+ break;
38496+ }
3849038497 case X86ISD::FOR: {
3849138498 KnownBits Known2;
3849238499 Known = DAG.computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3849338500 Known2 = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
38494-
3849538501 Known |= Known2;
3849638502 break;
3849738503 }
@@ -44147,6 +44153,55 @@ bool X86TargetLowering::SimplifyDemandedBitsForTargetNode(
4414744153 Known.Zero |= Known2.One;
4414844154 break;
4414944155 }
44156+ case X86ISD::FAND: {
44157+ KnownBits Known2;
44158+ SDValue Op0 = Op.getOperand(0);
44159+ SDValue Op1 = Op.getOperand(1);
44160+
44161+ if (SimplifyDemandedBits(Op1, OriginalDemandedBits, OriginalDemandedElts,
44162+ Known, TLO, Depth + 1))
44163+ return true;
44164+
44165+ if (SimplifyDemandedBits(Op0, ~Known.Zero & OriginalDemandedBits,
44166+ OriginalDemandedElts, Known2, TLO, Depth + 1))
44167+ return true;
44168+
44169+ // If all of the demanded bits are known one on one side, return the other.
44170+ // These bits cannot contribute to the result of the 'and'.
44171+ if (OriginalDemandedBits.isSubsetOf(Known2.Zero | Known.One))
44172+ return TLO.CombineTo(Op, Op0);
44173+ if (OriginalDemandedBits.isSubsetOf(Known.Zero | Known2.One))
44174+ return TLO.CombineTo(Op, Op1);
44175+ // If all of the demanded bits in the inputs are known zeros, return zero.
44176+ if (OriginalDemandedBits.isSubsetOf(Known.Zero | Known2.Zero))
44177+ return TLO.CombineTo(Op, TLO.DAG.getConstantFP(0.0, SDLoc(Op), VT));
44178+
44179+ Known &= Known2;
44180+ break;
44181+ }
44182+ case X86ISD::FOR: {
44183+ KnownBits Known2;
44184+ SDValue Op0 = Op.getOperand(0);
44185+ SDValue Op1 = Op.getOperand(1);
44186+
44187+ if (SimplifyDemandedBits(Op1, OriginalDemandedBits, OriginalDemandedElts,
44188+ Known, TLO, Depth + 1))
44189+ return true;
44190+
44191+ if (SimplifyDemandedBits(Op0, ~Known.One & OriginalDemandedBits,
44192+ OriginalDemandedElts, Known2, TLO, Depth + 1))
44193+ return true;
44194+
44195+ // If all of the demanded bits are known zero on one side, return the other.
44196+ // These bits cannot contribute to the result of the 'or'.
44197+ if (OriginalDemandedBits.isSubsetOf(Known2.One | Known.Zero))
44198+ return TLO.CombineTo(Op, Op0);
44199+ if (OriginalDemandedBits.isSubsetOf(Known.One | Known2.Zero))
44200+ return TLO.CombineTo(Op, Op1);
44201+
44202+ Known |= Known2;
44203+ break;
44204+ }
4415044205 case X86ISD::VSHLI: {
4415144206 SDValue Op0 = Op.getOperand(0);
4415244207 SDValue Op1 = Op.getOperand(1);
0 commit comments