@@ -41629,23 +41629,28 @@ static SDValue canonicalizeShuffleWithOp(SDValue N, SelectionDAG &DAG,
4162941629 case X86ISD::PSHUFD:
4163041630 case X86ISD::PSHUFHW:
4163141631 case X86ISD::PSHUFLW:
41632+ case X86ISD::VPERMV:
4163241633 case X86ISD::VPERMI:
4163341634 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));
4163741639 unsigned SrcOpcode = N0.getOpcode();
4163841640 EVT OpVT = N0.getValueType();
4163941641 if (TLI.isBinOp(SrcOpcode) && IsSafeToMoveShuffle(N0, SrcOpcode)) {
4164041642 SDValue Op00 = peekThroughOneUseBitcasts(N0.getOperand(0));
4164141643 SDValue Op01 = peekThroughOneUseBitcasts(N0.getOperand(1));
41642- bool FoldShuf = Opc != X86ISD::VPERMI;
41644+ bool FoldShuf = Opc != X86ISD::VPERMI && Opc != X86ISD::VPERMV ;
4164341645 if (IsMergeableWithShuffle(Op00, FoldShuf) ||
4164441646 IsMergeableWithShuffle(Op01, FoldShuf)) {
4164541647 SDValue LHS, RHS;
4164641648 Op00 = DAG.getBitcast(ShuffleVT, Op00);
4164741649 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) {
4164941654 LHS = DAG.getNode(Opc, DL, ShuffleVT, Op00, N.getOperand(1));
4165041655 RHS = DAG.getNode(Opc, DL, ShuffleVT, Op01, N.getOperand(1));
4165141656 } else {
@@ -41661,11 +41666,13 @@ static SDValue canonicalizeShuffleWithOp(SDValue N, SelectionDAG &DAG,
4166141666 if (SrcOpcode == ISD::SINT_TO_FP && IsSafeToMoveShuffle(N0, SrcOpcode) &&
4166241667 OpVT.getScalarSizeInBits() ==
4166341668 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);
4166941676 Res = DAG.getBitcast(N0.getOperand(0).getValueType(), Res);
4167041677 return DAG.getBitcast(ShuffleVT, DAG.getNode(SrcOpcode, DL, OpVT, Res));
4167141678 }
0 commit comments