Skip to content

Commit bd728b8

Browse files
committed
[X86] SimplifyDemandedBitsForTargetNode - add handling for X86ISD::FAND/FOR
Also add computeKnownBitsForTargetNode handling for X86ISD::FAND Fixes #136368
1 parent aa5cdc0 commit bd728b8

File tree

2 files changed

+68
-19
lines changed

2 files changed

+68
-19
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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);

llvm/test/CodeGen/X86/combine-fcopysign.ll

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -252,28 +252,22 @@ define double @PR136368(double %x) {
252252
; SSE-LABEL: PR136368:
253253
; SSE: # %bb.0:
254254
; SSE-NEXT: movapd {{.*#+}} xmm1 = [NaN,NaN]
255-
; SSE-NEXT: movapd %xmm0, %xmm2
256-
; SSE-NEXT: andpd %xmm1, %xmm2
257-
; SSE-NEXT: movsd {{.*#+}} xmm3 = [1.5707963267948966E+0,0.0E+0]
258-
; SSE-NEXT: movapd %xmm3, %xmm4
259-
; SSE-NEXT: cmpltsd %xmm2, %xmm4
260-
; SSE-NEXT: andpd %xmm3, %xmm4
261-
; SSE-NEXT: andpd %xmm1, %xmm4
262-
; SSE-NEXT: andnpd %xmm0, %xmm1
263-
; SSE-NEXT: orpd %xmm4, %xmm1
264-
; SSE-NEXT: movapd %xmm1, %xmm0
255+
; SSE-NEXT: andpd %xmm0, %xmm1
256+
; SSE-NEXT: movsd {{.*#+}} xmm2 = [1.5707963267948966E+0,0.0E+0]
257+
; SSE-NEXT: movapd %xmm2, %xmm3
258+
; SSE-NEXT: cmpltsd %xmm1, %xmm3
259+
; SSE-NEXT: andpd %xmm2, %xmm3
260+
; SSE-NEXT: andpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
261+
; SSE-NEXT: orpd %xmm3, %xmm0
265262
; SSE-NEXT: retq
266263
;
267264
; AVX-LABEL: PR136368:
268265
; AVX: # %bb.0:
269-
; AVX-NEXT: vmovddup {{.*#+}} xmm1 = [NaN,NaN]
270-
; AVX-NEXT: # xmm1 = mem[0,0]
271-
; AVX-NEXT: vandpd %xmm1, %xmm0, %xmm2
272-
; AVX-NEXT: vmovsd {{.*#+}} xmm3 = [1.5707963267948966E+0,0.0E+0]
273-
; AVX-NEXT: vcmpltsd %xmm2, %xmm3, %xmm2
274-
; AVX-NEXT: vandpd %xmm3, %xmm2, %xmm2
275-
; AVX-NEXT: vandnpd %xmm0, %xmm1, %xmm0
276-
; AVX-NEXT: vandpd %xmm1, %xmm2, %xmm1
266+
; AVX-NEXT: vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
267+
; AVX-NEXT: vmovsd {{.*#+}} xmm2 = [1.5707963267948966E+0,0.0E+0]
268+
; AVX-NEXT: vcmpltsd %xmm1, %xmm2, %xmm1
269+
; AVX-NEXT: vandpd %xmm2, %xmm1, %xmm1
270+
; AVX-NEXT: vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
277271
; AVX-NEXT: vorpd %xmm0, %xmm1, %xmm0
278272
; AVX-NEXT: retq
279273
%fabs = tail call double @llvm.fabs.f64(double %x)

0 commit comments

Comments
 (0)