@@ -41629,23 +41629,28 @@ static SDValue canonicalizeShuffleWithOp(SDValue N, SelectionDAG &DAG,
41629
41629
case X86ISD::PSHUFD:
41630
41630
case X86ISD::PSHUFHW:
41631
41631
case X86ISD::PSHUFLW:
41632
+ case X86ISD::VPERMV:
41632
41633
case X86ISD::VPERMI:
41633
41634
case X86ISD::VPERMILPI: {
41634
- if (N.getOperand(0).getValueType() == ShuffleVT &&
41635
- N->isOnlyUserOf(N.getOperand(0).getNode())) {
41636
- SDValue N0 = peekThroughOneUseBitcasts(N.getOperand(0));
41635
+ unsigned SrcIdx = Opc == X86ISD::VPERMV ? 1 : 0;
41636
+ if (N.getOperand(SrcIdx).getValueType() == ShuffleVT &&
41637
+ N->isOnlyUserOf(N.getOperand(SrcIdx).getNode())) {
41638
+ SDValue N0 = peekThroughOneUseBitcasts(N.getOperand(SrcIdx));
41637
41639
unsigned SrcOpcode = N0.getOpcode();
41638
41640
EVT OpVT = N0.getValueType();
41639
41641
if (TLI.isBinOp(SrcOpcode) && IsSafeToMoveShuffle(N0, SrcOpcode)) {
41640
41642
SDValue Op00 = peekThroughOneUseBitcasts(N0.getOperand(0));
41641
41643
SDValue Op01 = peekThroughOneUseBitcasts(N0.getOperand(1));
41642
- bool FoldShuf = Opc != X86ISD::VPERMI;
41644
+ bool FoldShuf = Opc != X86ISD::VPERMI && Opc != X86ISD::VPERMV ;
41643
41645
if (IsMergeableWithShuffle(Op00, FoldShuf) ||
41644
41646
IsMergeableWithShuffle(Op01, FoldShuf)) {
41645
41647
SDValue LHS, RHS;
41646
41648
Op00 = DAG.getBitcast(ShuffleVT, Op00);
41647
41649
Op01 = DAG.getBitcast(ShuffleVT, Op01);
41648
- if (N.getNumOperands() == 2) {
41650
+ if (Opc == X86ISD::VPERMV) {
41651
+ LHS = DAG.getNode(Opc, DL, ShuffleVT, N.getOperand(0), Op00);
41652
+ RHS = DAG.getNode(Opc, DL, ShuffleVT, N.getOperand(0), Op01);
41653
+ } else if (N.getNumOperands() == 2) {
41649
41654
LHS = DAG.getNode(Opc, DL, ShuffleVT, Op00, N.getOperand(1));
41650
41655
RHS = DAG.getNode(Opc, DL, ShuffleVT, Op01, N.getOperand(1));
41651
41656
} else {
@@ -41661,11 +41666,13 @@ static SDValue canonicalizeShuffleWithOp(SDValue N, SelectionDAG &DAG,
41661
41666
if (SrcOpcode == ISD::SINT_TO_FP && IsSafeToMoveShuffle(N0, SrcOpcode) &&
41662
41667
OpVT.getScalarSizeInBits() ==
41663
41668
N0.getOperand(0).getScalarValueSizeInBits()) {
41664
- SDValue Op00 = DAG.getBitcast(ShuffleVT, N0.getOperand(0));
41665
- SDValue Res =
41666
- N.getNumOperands() == 2
41667
- ? DAG.getNode(Opc, DL, ShuffleVT, Op00, N.getOperand(1))
41668
- : DAG.getNode(Opc, DL, ShuffleVT, Op00);
41669
+ SDValue Res = DAG.getBitcast(ShuffleVT, N0.getOperand(0));
41670
+ if (Opc == X86ISD::VPERMV)
41671
+ Res = DAG.getNode(Opc, DL, ShuffleVT, N.getOperand(0), Res);
41672
+ else if (N.getNumOperands() == 2)
41673
+ Res = DAG.getNode(Opc, DL, ShuffleVT, Res, N.getOperand(1));
41674
+ else
41675
+ Res = DAG.getNode(Opc, DL, ShuffleVT, Res);
41669
41676
Res = DAG.getBitcast(N0.getOperand(0).getValueType(), Res);
41670
41677
return DAG.getBitcast(ShuffleVT, DAG.getNode(SrcOpcode, DL, OpVT, Res));
41671
41678
}
0 commit comments