4242#include " llvm/TargetParser/Triple.h"
4343#include < algorithm>
4444#include < cassert>
45+ #include < cstddef>
4546#include < cstdint>
4647#include < iterator>
4748#include < utility>
@@ -2952,8 +2953,12 @@ static SDValue lowerVECTOR_SHUFFLE_PCKOD(SDValue Op, EVT ResTy,
29522953// if the type is v8i16 and all the indices are less than 8 then the second
29532954// operand is unused and can be replaced with anything. We choose to replace it
29542955// with the used operand since this reduces the number of instructions overall.
2956+ //
2957+ // NOTE: SPLATI shuffle masks may contain UNDEFs, since isSPLATI() treats
2958+ // UNDEFs as the SPLATI index.
29552959static SDValue lowerVECTOR_SHUFFLE_VSHF (SDValue Op, EVT ResTy,
29562960 const SmallVector<int , 16 > &Indices,
2961+ const bool isSPLATI,
29572962 SelectionDAG &DAG) {
29582963 SmallVector<SDValue, 16 > Ops;
29592964 SDValue Op0;
@@ -2965,6 +2970,9 @@ static SDValue lowerVECTOR_SHUFFLE_VSHF(SDValue Op, EVT ResTy,
29652970 SDLoc DL (Op);
29662971 int ResTyNumElts = ResTy.getVectorNumElements ();
29672972
2973+ assert (Indices[0 ] >= 0 &&
2974+ " shuffle mask starts at a UNDEF, which is not expected" );
2975+
29682976 for (int i = 0 ; i < ResTyNumElts; ++i) {
29692977 // Idx == -1 means UNDEF
29702978 int Idx = Indices[i];
@@ -2975,8 +2983,16 @@ static SDValue lowerVECTOR_SHUFFLE_VSHF(SDValue Op, EVT ResTy,
29752983 Using2ndVec = true ;
29762984 }
29772985
2978- for (int Idx : Indices)
2986+ for (size_t i = 0 ; i < Indices.size (); i++) {
2987+ int Idx = Indices[i];
2988+ if (isSPLATI && Indices[i] < 0 ) {
2989+ Idx = Indices[0 ];
2990+ }
2991+ if (!isSPLATI && Indices[i] < 0 ) {
2992+ Idx = Indices[i - 1 ];
2993+ }
29792994 Ops.push_back (DAG.getTargetConstant (Idx, DL, MaskEltTy));
2995+ }
29802996
29812997 SDValue MaskVec = DAG.getBuildVector (MaskVecTy, DL, Ops);
29822998
@@ -3019,7 +3035,7 @@ SDValue MipsSETargetLowering::lowerVECTOR_SHUFFLE(SDValue Op,
30193035 // splati.[bhwd] is preferable to the others but is matched from
30203036 // MipsISD::VSHF.
30213037 if (isVECTOR_SHUFFLE_SPLATI (Op, ResTy, Indices, DAG))
3022- return lowerVECTOR_SHUFFLE_VSHF (Op, ResTy, Indices, DAG);
3038+ return lowerVECTOR_SHUFFLE_VSHF (Op, ResTy, Indices, true , DAG);
30233039 SDValue Result;
30243040 if ((Result = lowerVECTOR_SHUFFLE_ILVEV (Op, ResTy, Indices, DAG)))
30253041 return Result;
@@ -3035,7 +3051,7 @@ SDValue MipsSETargetLowering::lowerVECTOR_SHUFFLE(SDValue Op,
30353051 return Result;
30363052 if ((Result = lowerVECTOR_SHUFFLE_SHF (Op, ResTy, Indices, DAG)))
30373053 return Result;
3038- return lowerVECTOR_SHUFFLE_VSHF (Op, ResTy, Indices, DAG);
3054+ return lowerVECTOR_SHUFFLE_VSHF (Op, ResTy, Indices, false , DAG);
30393055}
30403056
30413057MachineBasicBlock *
0 commit comments