@@ -7401,8 +7401,8 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
7401
7401
7402
7402
// Handle OR(SHUFFLE,SHUFFLE) case where one source is zero and the other
7403
7403
// is a valid shuffle index.
7404
- SDValue N0 = peekThroughBitcasts (N.getOperand(0));
7405
- SDValue N1 = peekThroughBitcasts (N.getOperand(1));
7404
+ SDValue N0 = peekThroughOneUseBitcasts (N.getOperand(0));
7405
+ SDValue N1 = peekThroughOneUseBitcasts (N.getOperand(1));
7406
7406
if (!N0.getValueType().isVector() || !N1.getValueType().isVector())
7407
7407
return false;
7408
7408
SmallVector<int, 64> SrcMask0, SrcMask1;
@@ -7413,24 +7413,34 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
7413
7413
true))
7414
7414
return false;
7415
7415
7416
+ // Shuffle inputs must be the same size as the result.
7417
+ if (llvm::any_of(SrcInputs0, [VT](SDValue Op) {
7418
+ return VT.getSizeInBits() != Op.getValueSizeInBits();
7419
+ }))
7420
+ return false;
7421
+ if (llvm::any_of(SrcInputs1, [VT](SDValue Op) {
7422
+ return VT.getSizeInBits() != Op.getValueSizeInBits();
7423
+ }))
7424
+ return false;
7425
+
7416
7426
size_t MaskSize = std::max(SrcMask0.size(), SrcMask1.size());
7417
7427
SmallVector<int, 64> Mask0, Mask1;
7418
7428
narrowShuffleMaskElts(MaskSize / SrcMask0.size(), SrcMask0, Mask0);
7419
7429
narrowShuffleMaskElts(MaskSize / SrcMask1.size(), SrcMask1, Mask1);
7420
- for (int i = 0; i != (int) MaskSize; ++i) {
7430
+ for (size_t i = 0; i != MaskSize; ++i) {
7421
7431
if (Mask0[i] == SM_SentinelUndef && Mask1[i] == SM_SentinelUndef)
7422
7432
Mask.push_back(SM_SentinelUndef);
7423
7433
else if (Mask0[i] == SM_SentinelZero && Mask1[i] == SM_SentinelZero)
7424
7434
Mask.push_back(SM_SentinelZero);
7425
7435
else if (Mask1[i] == SM_SentinelZero)
7426
- Mask.push_back(i );
7436
+ Mask.push_back(Mask0[i] );
7427
7437
else if (Mask0[i] == SM_SentinelZero)
7428
- Mask.push_back(i + MaskSize);
7438
+ Mask.push_back(Mask1[i] + (int)( MaskSize * SrcInputs0.size()) );
7429
7439
else
7430
7440
return false;
7431
7441
}
7432
- Ops.push_back(N0 );
7433
- Ops.push_back(N1 );
7442
+ Ops.append(SrcInputs0.begin(), SrcInputs0.end() );
7443
+ Ops.append(SrcInputs1.begin(), SrcInputs1.end() );
7434
7444
return true;
7435
7445
}
7436
7446
case ISD::INSERT_SUBVECTOR: {
@@ -34209,7 +34219,6 @@ static bool matchBinaryShuffle(MVT MaskVT, ArrayRef<int> Mask,
34209
34219
SelectionDAG &DAG, const X86Subtarget &Subtarget,
34210
34220
unsigned &Shuffle, MVT &SrcVT, MVT &DstVT,
34211
34221
bool IsUnary) {
34212
- unsigned NumMaskElts = Mask.size();
34213
34222
unsigned EltSizeInBits = MaskVT.getScalarSizeInBits();
34214
34223
34215
34224
if (MaskVT.is128BitVector()) {
@@ -34267,46 +34276,6 @@ static bool matchBinaryShuffle(MVT MaskVT, ArrayRef<int> Mask,
34267
34276
}
34268
34277
}
34269
34278
34270
- // Attempt to match against a OR if we're performing a blend shuffle and the
34271
- // non-blended source element is zero in each case.
34272
- if ((EltSizeInBits % V1.getScalarValueSizeInBits()) == 0 &&
34273
- (EltSizeInBits % V2.getScalarValueSizeInBits()) == 0) {
34274
- bool IsBlend = true;
34275
- unsigned NumV1Elts = V1.getValueType().getVectorNumElements();
34276
- unsigned NumV2Elts = V2.getValueType().getVectorNumElements();
34277
- unsigned Scale1 = NumV1Elts / NumMaskElts;
34278
- unsigned Scale2 = NumV2Elts / NumMaskElts;
34279
- APInt DemandedZeroV1 = APInt::getNullValue(NumV1Elts);
34280
- APInt DemandedZeroV2 = APInt::getNullValue(NumV2Elts);
34281
- for (unsigned i = 0; i != NumMaskElts; ++i) {
34282
- int M = Mask[i];
34283
- if (M == SM_SentinelUndef)
34284
- continue;
34285
- if (M == SM_SentinelZero) {
34286
- DemandedZeroV1.setBits(i * Scale1, (i + 1) * Scale1);
34287
- DemandedZeroV2.setBits(i * Scale2, (i + 1) * Scale2);
34288
- continue;
34289
- }
34290
- if (M == i) {
34291
- DemandedZeroV2.setBits(i * Scale2, (i + 1) * Scale2);
34292
- continue;
34293
- }
34294
- if (M == (i + NumMaskElts)) {
34295
- DemandedZeroV1.setBits(i * Scale1, (i + 1) * Scale1);
34296
- continue;
34297
- }
34298
- IsBlend = false;
34299
- break;
34300
- }
34301
- if (IsBlend &&
34302
- DAG.computeKnownBits(V1, DemandedZeroV1).isZero() &&
34303
- DAG.computeKnownBits(V2, DemandedZeroV2).isZero()) {
34304
- Shuffle = ISD::OR;
34305
- SrcVT = DstVT = EVT(MaskVT).changeTypeToInteger().getSimpleVT();
34306
- return true;
34307
- }
34308
- }
34309
-
34310
34279
return false;
34311
34280
}
34312
34281
0 commit comments