@@ -55491,14 +55491,22 @@ static SDValue combineAVX512SetCCToKMOV(EVT VT, SDValue Op0, ISD::CondCode CC,
55491
55491
break;
55492
55492
}
55493
55493
55494
- if (EltBits[I] != 1ULL << (N + I))
55494
+ if (! EltBits[I].isOneBitSet (N + I))
55495
55495
return SDValue();
55496
55496
}
55497
55497
55498
- SDValue BroadcastOp = Broadcast.getOpcode() == X86ISD::VBROADCAST
55499
- ? Broadcast.getOperand(0)
55500
- : Broadcast.getOperand(1);
55501
- MVT BroadcastOpVT = BroadcastOp.getSimpleValueType();
55498
+ const TargetLowering &TLI = DAG.getTargetLoweringInfo();
55499
+ const DataLayout &DL = DAG.getDataLayout();
55500
+ MVT VecIdxTy = TLI.getVectorIdxTy(DL);
55501
+ MVT BroadcastOpVT = Broadcast.getSimpleValueType().getVectorElementType();
55502
+ SDValue BroadcastOp;
55503
+ if (Broadcast.getOpcode() != X86ISD::VBROADCAST) {
55504
+ BroadcastOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, BroadcastOpVT,
55505
+ Broadcast, DAG.getConstant(0, DL, VecIdxTy));
55506
+ } else {
55507
+ BroadcastOp = Broadcast.getOperand(0);
55508
+ }
55509
+
55502
55510
SDValue Masked = BroadcastOp;
55503
55511
if (N != 0) {
55504
55512
unsigned Mask = (1ULL << Len) - 1;
@@ -55507,17 +55515,17 @@ static SDValue combineAVX512SetCCToKMOV(EVT VT, SDValue Op0, ISD::CondCode CC,
55507
55515
Masked = DAG.getNode(ISD::AND, DL, BroadcastOpVT, ShiftedValue,
55508
55516
DAG.getConstant(Mask, DL, BroadcastOpVT));
55509
55517
}
55518
+ // We can't extract more than 16 bits using this pattern, because 2^{17} will
55519
+ // not fit in an i16 and a vXi32 where X > 16 is more than 512 bits.
55510
55520
SDValue Trunc = DAG.getAnyExtOrTrunc(Masked, DL, MVT::i16);
55511
55521
SDValue Bitcast = DAG.getNode(ISD::BITCAST, DL, MVT::v16i1, Trunc);
55512
- MVT PtrTy = DAG.getTargetLoweringInfo(). getPointerTy(DAG.getDataLayout() );
55522
+ MVT PtrTy = TLI. getPointerTy(DL );
55513
55523
55514
55524
if (CC == ISD::SETEQ)
55515
- Bitcast = DAG.getNode(
55516
- ISD::XOR, DL, MVT::v16i1, Bitcast,
55517
- DAG.getSplatBuildVector(
55518
- MVT::v16i1, DL,
55519
- DAG.getConstant(APInt::getAllOnes(PtrTy.getSizeInBits()), DL,
55520
- PtrTy)));
55525
+ Bitcast =
55526
+ DAG.getNode(ISD::XOR, DL, MVT::v16i1, Bitcast,
55527
+ DAG.getSplatBuildVector(MVT::v16i1, DL,
55528
+ DAG.getAllOnesConstant(DL, PtrTy)));
55521
55529
55522
55530
if (VT != MVT::v16i1)
55523
55531
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Bitcast,
@@ -55659,11 +55667,10 @@ static SDValue combineSetCC(SDNode *N, SelectionDAG &DAG,
55659
55667
return Op0.getOperand(0);
55660
55668
}
55661
55669
55662
- if (IsVZero1) {
55670
+ if (IsVZero1)
55663
55671
if (SDValue V =
55664
55672
combineAVX512SetCCToKMOV(VT, Op0, TmpCC, DL, DAG, Subtarget))
55665
55673
return V;
55666
- }
55667
55674
}
55668
55675
55669
55676
// Try and make unsigned vector comparison signed. On pre AVX512 targets there
0 commit comments