Skip to content

Commit 1e155ce

Browse files
committed
[X86] SimplifyDemandedBitsForTargetNode - add TESTPS/TESTPD support
We only need the sign bits from these nodes Another step towards Issue llvm#60007
1 parent 2811085 commit 1e155ce

File tree

3 files changed

+30
-13
lines changed

3 files changed

+30
-13
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43742,6 +43742,20 @@ bool X86TargetLowering::SimplifyDemandedBitsForTargetNode(
4374243742
return TLO.CombineTo(Op, TLO.DAG.getNode(Opc, SDLoc(Op), VT, NewSrc));
4374343743
return false;
4374443744
}
43745+
case X86ISD::TESTP: {
43746+
SDValue Op0 = Op.getOperand(0);
43747+
SDValue Op1 = Op.getOperand(1);
43748+
MVT OpVT = Op0.getSimpleValueType();
43749+
assert((OpVT.getVectorElementType() == MVT::f32 ||
43750+
OpVT.getVectorElementType() == MVT::f64) &&
43751+
"Illegal vector type for X86ISD::TESTP");
43752+
43753+
// TESTPS/TESTPD only demands the sign bits of ALL the elements.
43754+
KnownBits KnownSrc;
43755+
APInt SignMask = APInt::getSignMask(OpVT.getScalarSizeInBits());
43756+
return SimplifyDemandedBits(Op0, SignMask, KnownSrc, TLO, Depth + 1) ||
43757+
SimplifyDemandedBits(Op1, SignMask, KnownSrc, TLO, Depth + 1);
43758+
}
4374543759
case X86ISD::BEXTR:
4374643760
case X86ISD::BEXTRI: {
4374743761
SDValue Op0 = Op.getOperand(0);
@@ -54658,6 +54672,21 @@ static SDValue combineMOVMSK(SDNode *N, SelectionDAG &DAG,
5465854672
return SDValue();
5465954673
}
5466054674

54675+
static SDValue combineTESTP(SDNode *N, SelectionDAG &DAG,
54676+
TargetLowering::DAGCombinerInfo &DCI,
54677+
const X86Subtarget &Subtarget) {
54678+
MVT VT = N->getSimpleValueType(0);
54679+
unsigned NumBits = VT.getScalarSizeInBits();
54680+
54681+
// Simplify the inputs.
54682+
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
54683+
APInt DemandedMask(APInt::getAllOnes(NumBits));
54684+
if (TLI.SimplifyDemandedBits(SDValue(N, 0), DemandedMask, DCI))
54685+
return SDValue(N, 0);
54686+
54687+
return SDValue();
54688+
}
54689+
5466154690
static SDValue combineX86GatherScatter(SDNode *N, SelectionDAG &DAG,
5466254691
TargetLowering::DAGCombinerInfo &DCI,
5466354692
const X86Subtarget &Subtarget) {
@@ -57545,6 +57574,7 @@ SDValue X86TargetLowering::PerformDAGCombine(SDNode *N,
5754557574
case X86ISD::FMADDSUB:
5754657575
case X86ISD::FMSUBADD: return combineFMADDSUB(N, DAG, DCI);
5754757576
case X86ISD::MOVMSK: return combineMOVMSK(N, DAG, DCI, Subtarget);
57577+
case X86ISD::TESTP: return combineTESTP(N, DAG, DCI, Subtarget);
5754857578
case X86ISD::MGATHER:
5754957579
case X86ISD::MSCATTER:
5755057580
return combineX86GatherScatter(N, DAG, DCI, Subtarget);

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,6 @@ define i32 @testpdc_128_signbit(<2 x double> %c, <2 x double> %d, i32 %a, i32 %b
157157
; CHECK-LABEL: testpdc_128_signbit:
158158
; CHECK: # %bb.0:
159159
; CHECK-NEXT: movl %edi, %eax
160-
; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2
161-
; CHECK-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm0
162160
; CHECK-NEXT: vtestpd %xmm1, %xmm0
163161
; CHECK-NEXT: cmovael %esi, %eax
164162
; CHECK-NEXT: retq
@@ -175,11 +173,6 @@ define i32 @testpdz_256_signbit(<4 x double> %c, <4 x double> %d, i32 %a, i32 %b
175173
; CHECK-LABEL: testpdz_256_signbit:
176174
; CHECK: # %bb.0:
177175
; CHECK-NEXT: movl %edi, %eax
178-
; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm2
179-
; CHECK-NEXT: vpxor %xmm3, %xmm3, %xmm3
180-
; CHECK-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
181-
; CHECK-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm0
182-
; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
183176
; CHECK-NEXT: vtestpd %ymm1, %ymm0
184177
; CHECK-NEXT: cmovnel %esi, %eax
185178
; CHECK-NEXT: vzeroupper

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,6 @@ define i32 @testpsz_128_signbit(<4 x float> %c, <4 x float> %d, i32 %a, i32 %b)
157157
; CHECK-LABEL: testpsz_128_signbit:
158158
; CHECK: # %bb.0:
159159
; CHECK-NEXT: movl %edi, %eax
160-
; CHECK-NEXT: vpsrad $31, %xmm0, %xmm0
161160
; CHECK-NEXT: vtestps %xmm1, %xmm0
162161
; CHECK-NEXT: cmovnel %esi, %eax
163162
; CHECK-NEXT: retq
@@ -174,11 +173,6 @@ define i32 @testpsnzc_256_signbit(<8 x float> %c, <8 x float> %d, i32 %a, i32 %b
174173
; CHECK-LABEL: testpsnzc_256_signbit:
175174
; CHECK: # %bb.0:
176175
; CHECK-NEXT: movl %edi, %eax
177-
; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm2
178-
; CHECK-NEXT: vpxor %xmm3, %xmm3, %xmm3
179-
; CHECK-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2
180-
; CHECK-NEXT: vpcmpgtd %xmm0, %xmm3, %xmm0
181-
; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
182176
; CHECK-NEXT: vtestps %ymm1, %ymm0
183177
; CHECK-NEXT: cmovnel %esi, %eax
184178
; CHECK-NEXT: vzeroupper

0 commit comments

Comments
 (0)