@@ -161,6 +161,8 @@ bool matchREV(MachineInstr &MI, MachineRegisterInfo &MRI,
161
161
Register Dst = MI.getOperand (0 ).getReg ();
162
162
Register Src = MI.getOperand (1 ).getReg ();
163
163
LLT Ty = MRI.getType (Dst);
164
+ if (Ty.isScalableVector ())
165
+ return false ;
164
166
unsigned EltSize = Ty.getScalarSizeInBits ();
165
167
166
168
// Element size for a rev cannot be 64.
@@ -196,7 +198,10 @@ bool matchTRN(MachineInstr &MI, MachineRegisterInfo &MRI,
196
198
unsigned WhichResult;
197
199
ArrayRef<int > ShuffleMask = MI.getOperand (3 ).getShuffleMask ();
198
200
Register Dst = MI.getOperand (0 ).getReg ();
199
- unsigned NumElts = MRI.getType (Dst).getNumElements ();
201
+ LLT DstTy = MRI.getType (Dst);
202
+ if (DstTy.isScalableVector ())
203
+ return false ;
204
+ unsigned NumElts = DstTy.getNumElements ();
200
205
if (!isTRNMask (ShuffleMask, NumElts, WhichResult))
201
206
return false ;
202
207
unsigned Opc = (WhichResult == 0 ) ? AArch64::G_TRN1 : AArch64::G_TRN2;
@@ -217,7 +222,10 @@ bool matchUZP(MachineInstr &MI, MachineRegisterInfo &MRI,
217
222
unsigned WhichResult;
218
223
ArrayRef<int > ShuffleMask = MI.getOperand (3 ).getShuffleMask ();
219
224
Register Dst = MI.getOperand (0 ).getReg ();
220
- unsigned NumElts = MRI.getType (Dst).getNumElements ();
225
+ LLT DstTy = MRI.getType (Dst);
226
+ if (DstTy.isScalableVector ())
227
+ return false ;
228
+ unsigned NumElts = DstTy.getNumElements ();
221
229
if (!isUZPMask (ShuffleMask, NumElts, WhichResult))
222
230
return false ;
223
231
unsigned Opc = (WhichResult == 0 ) ? AArch64::G_UZP1 : AArch64::G_UZP2;
@@ -233,7 +241,10 @@ bool matchZip(MachineInstr &MI, MachineRegisterInfo &MRI,
233
241
unsigned WhichResult;
234
242
ArrayRef<int > ShuffleMask = MI.getOperand (3 ).getShuffleMask ();
235
243
Register Dst = MI.getOperand (0 ).getReg ();
236
- unsigned NumElts = MRI.getType (Dst).getNumElements ();
244
+ LLT DstTy = MRI.getType (Dst);
245
+ if (DstTy.isScalableVector ())
246
+ return false ;
247
+ unsigned NumElts = DstTy.getNumElements ();
237
248
if (!isZIPMask (ShuffleMask, NumElts, WhichResult))
238
249
return false ;
239
250
unsigned Opc = (WhichResult == 0 ) ? AArch64::G_ZIP1 : AArch64::G_ZIP2;
@@ -288,7 +299,10 @@ bool matchDupFromBuildVector(int Lane, MachineInstr &MI,
288
299
MachineRegisterInfo &MRI,
289
300
ShuffleVectorPseudo &MatchInfo) {
290
301
assert (Lane >= 0 && " Expected positive lane?" );
291
- int NumElements = MRI.getType (MI.getOperand (1 ).getReg ()).getNumElements ();
302
+ LLT Op1Ty = MRI.getType (MI.getOperand (1 ).getReg ());
303
+ if (Op1Ty.isScalableVector ())
304
+ return false ;
305
+ int NumElements = Op1Ty.getNumElements ();
292
306
// Test if the LHS is a BUILD_VECTOR. If it is, then we can just reference the
293
307
// lane's definition directly.
294
308
auto *BuildVecMI =
@@ -326,6 +340,8 @@ bool matchDup(MachineInstr &MI, MachineRegisterInfo &MRI,
326
340
// Check if an EXT instruction can handle the shuffle mask when the vector
327
341
// sources of the shuffle are the same.
328
342
bool isSingletonExtMask (ArrayRef<int > M, LLT Ty) {
343
+ if (Ty.isScalableVector ())
344
+ return false ;
329
345
unsigned NumElts = Ty.getNumElements ();
330
346
331
347
// Assume that the first shuffle index is not UNDEF. Fail if it is.
@@ -357,12 +373,17 @@ bool matchEXT(MachineInstr &MI, MachineRegisterInfo &MRI,
357
373
assert (MI.getOpcode () == TargetOpcode::G_SHUFFLE_VECTOR);
358
374
Register Dst = MI.getOperand (0 ).getReg ();
359
375
LLT DstTy = MRI.getType (Dst);
376
+ if (DstTy.isScalableVector ())
377
+ return false ;
360
378
Register V1 = MI.getOperand (1 ).getReg ();
361
379
Register V2 = MI.getOperand (2 ).getReg ();
362
380
auto Mask = MI.getOperand (3 ).getShuffleMask ();
363
381
uint64_t Imm;
364
382
auto ExtInfo = getExtMask (Mask, DstTy.getNumElements ());
365
- uint64_t ExtFactor = MRI.getType (V1).getScalarSizeInBits () / 8 ;
383
+ LLT V1Ty = MRI.getType (V1);
384
+ if (V1Ty.isScalableVector ())
385
+ return false ;
386
+ uint64_t ExtFactor = V1Ty.getScalarSizeInBits () / 8 ;
366
387
367
388
if (!ExtInfo) {
368
389
if (!getOpcodeDef<GImplicitDef>(V2, MRI) ||
@@ -423,6 +444,8 @@ void applyNonConstInsert(MachineInstr &MI, MachineRegisterInfo &MRI,
423
444
424
445
Register Offset = Insert.getIndexReg ();
425
446
LLT VecTy = MRI.getType (Insert.getReg (0 ));
447
+ if (VecTy.isScalableVector ())
448
+ return ;
426
449
LLT EltTy = MRI.getType (Insert.getElementReg ());
427
450
LLT IdxTy = MRI.getType (Insert.getIndexReg ());
428
451
@@ -473,7 +496,10 @@ bool matchINS(MachineInstr &MI, MachineRegisterInfo &MRI,
473
496
assert (MI.getOpcode () == TargetOpcode::G_SHUFFLE_VECTOR);
474
497
ArrayRef<int > ShuffleMask = MI.getOperand (3 ).getShuffleMask ();
475
498
Register Dst = MI.getOperand (0 ).getReg ();
476
- int NumElts = MRI.getType (Dst).getNumElements ();
499
+ LLT DstTy = MRI.getType (Dst);
500
+ if (DstTy.isScalableVector ())
501
+ return false ;
502
+ int NumElts = DstTy.getNumElements ();
477
503
auto DstIsLeftAndDstLane = isINSMask (ShuffleMask, NumElts);
478
504
if (!DstIsLeftAndDstLane)
479
505
return false ;
@@ -522,6 +548,8 @@ bool isVShiftRImm(Register Reg, MachineRegisterInfo &MRI, LLT Ty,
522
548
if (!Cst)
523
549
return false ;
524
550
Cnt = *Cst;
551
+ if (Ty.isScalableVector ())
552
+ return false ;
525
553
int64_t ElementBits = Ty.getScalarSizeInBits ();
526
554
return Cnt >= 1 && Cnt <= ElementBits;
527
555
}
@@ -698,6 +726,8 @@ bool matchDupLane(MachineInstr &MI, MachineRegisterInfo &MRI,
698
726
Register Src1Reg = MI.getOperand (1 ).getReg ();
699
727
const LLT SrcTy = MRI.getType (Src1Reg);
700
728
const LLT DstTy = MRI.getType (MI.getOperand (0 ).getReg ());
729
+ if (SrcTy.isScalableVector ())
730
+ return false ;
701
731
702
732
auto LaneIdx = getSplatIndex (MI);
703
733
if (!LaneIdx)
@@ -774,6 +804,8 @@ bool matchScalarizeVectorUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI) {
774
804
auto &Unmerge = cast<GUnmerge>(MI);
775
805
Register Src1Reg = Unmerge.getReg (Unmerge.getNumOperands () - 1 );
776
806
const LLT SrcTy = MRI.getType (Src1Reg);
807
+ if (SrcTy.isScalableVector ())
808
+ return false ;
777
809
if (SrcTy.getSizeInBits () != 128 && SrcTy.getSizeInBits () != 64 )
778
810
return false ;
779
811
return SrcTy.isVector () && !SrcTy.isScalable () &&
@@ -987,7 +1019,10 @@ bool matchLowerVectorFCMP(MachineInstr &MI, MachineRegisterInfo &MRI,
987
1019
if (!DstTy.isVector () || !ST.hasNEON ())
988
1020
return false ;
989
1021
Register LHS = MI.getOperand (2 ).getReg ();
990
- unsigned EltSize = MRI.getType (LHS).getScalarSizeInBits ();
1022
+ LLT LHSTy = MRI.getType (LHS);
1023
+ if (LHSTy.isScalableVector ())
1024
+ return false ;
1025
+ unsigned EltSize = LHSTy.getScalarSizeInBits ();
991
1026
if (EltSize == 16 && !ST.hasFullFP16 ())
992
1027
return false ;
993
1028
if (EltSize != 16 && EltSize != 32 && EltSize != 64 )
@@ -1183,7 +1218,7 @@ bool matchExtMulToMULL(MachineInstr &MI, MachineRegisterInfo &MRI) {
1183
1218
MachineInstr *I1 = getDefIgnoringCopies (MI.getOperand (1 ).getReg (), MRI);
1184
1219
MachineInstr *I2 = getDefIgnoringCopies (MI.getOperand (2 ).getReg (), MRI);
1185
1220
1186
- if (DstTy.isVector ()) {
1221
+ if (DstTy.isFixedVector ()) {
1187
1222
// If the source operands were EXTENDED before, then {U/S}MULL can be used
1188
1223
unsigned I1Opc = I1->getOpcode ();
1189
1224
unsigned I2Opc = I2->getOpcode ();
0 commit comments