@@ -68,6 +68,17 @@ typeIsLegalBoolVec(unsigned TypeIdx, std::initializer_list<LLT> BoolVecTys,
68
68
return all (typeInSet (TypeIdx, BoolVecTys), P);
69
69
}
70
70
71
+ static LegalityPredicate typeIsLegalPtrVec (unsigned TypeIdx,
72
+ std::initializer_list<LLT> PtrVecTys,
73
+ const RISCVSubtarget &ST) {
74
+ LegalityPredicate P = [=, &ST](const LegalityQuery &Query) {
75
+ return ST.hasVInstructions () &&
76
+ (Query.Types [TypeIdx].getElementCount ().getKnownMinValue () != 1 ||
77
+ ST.getELen () == 64 );
78
+ };
79
+ return all (typeInSet (TypeIdx, PtrVecTys), P);
80
+ }
81
+
71
82
RISCVLegalizerInfo::RISCVLegalizerInfo (const RISCVSubtarget &ST)
72
83
: STI(ST), XLen(STI.getXLen()), sXLen(LLT::scalar(XLen)) {
73
84
const LLT sDoubleXLen = LLT::scalar (2 * XLen);
@@ -112,6 +123,11 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
112
123
const LLT nxv4s64 = LLT::scalable_vector (4 , s64);
113
124
const LLT nxv8s64 = LLT::scalable_vector (8 , s64);
114
125
126
+ const LLT nxv1p0 = LLT::scalable_vector (1 , p0);
127
+ const LLT nxv2p0 = LLT::scalable_vector (2 , p0);
128
+ const LLT nxv4p0 = LLT::scalable_vector (4 , p0);
129
+ const LLT nxv8p0 = LLT::scalable_vector (8 , p0);
130
+
115
131
using namespace TargetOpcode ;
116
132
117
133
auto BoolVecTys = {nxv1s1, nxv2s1, nxv4s1, nxv8s1, nxv16s1, nxv32s1, nxv64s1};
@@ -121,6 +137,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
121
137
nxv32s16, nxv1s32, nxv2s32, nxv4s32, nxv8s32, nxv16s32,
122
138
nxv1s64, nxv2s64, nxv4s64, nxv8s64};
123
139
140
+ auto PtrVecTys = {nxv1p0, nxv2p0, nxv4p0, nxv8p0};
141
+
124
142
getActionDefinitionsBuilder ({G_ADD, G_SUB, G_AND, G_OR, G_XOR})
125
143
.legalFor ({s32, sXLen })
126
144
.legalIf (typeIsLegalIntOrFPVec (0 , IntOrFPVecTys, ST))
@@ -261,27 +279,27 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
261
279
.clampScalar (0 , s32, (XLen == 64 || ST.hasStdExtD ()) ? s64 : s32)
262
280
.clampScalar (1 , sXLen , sXLen );
263
281
264
- auto &LoadStoreActions =
265
- getActionDefinitionsBuilder ({G_LOAD, G_STORE} )
266
- .legalForTypesWithMemDesc ({{s32, p0, s8, 8 },
267
- {s32, p0, s16, 16 },
268
- {s32, p0, s32, 32 },
269
- {p0, p0, sXLen , XLen},
270
- {nxv2s8, p0, nxv2s8, 8 },
271
- {nxv4s8, p0, nxv4s8, 8 },
272
- {nxv8s8, p0, nxv8s8, 8 },
273
- {nxv16s8, p0, nxv16s8, 8 },
274
- {nxv32s8, p0, nxv32s8, 8 },
275
- {nxv64s8, p0, nxv64s8, 8 },
276
- {nxv2s16, p0, nxv2s16, 16 },
277
- {nxv4s16, p0, nxv4s16, 16 },
278
- {nxv8s16, p0, nxv8s16, 16 },
279
- {nxv16s16, p0, nxv16s16, 16 },
280
- {nxv32s16, p0, nxv32s16, 16 },
281
- {nxv2s32, p0, nxv2s32, 32 },
282
- {nxv4s32, p0, nxv4s32, 32 },
283
- {nxv8s32, p0, nxv8s32, 32 },
284
- {nxv16s32, p0, nxv16s32, 32 }});
282
+ auto &LoadStoreActions = getActionDefinitionsBuilder ({G_LOAD, G_STORE});
283
+ if (ST. hasVInstructions () )
284
+ LoadStoreActions .legalForTypesWithMemDesc ({{s32, p0, s8, 8 },
285
+ {s32, p0, s16, 16 },
286
+ {s32, p0, s32, 32 },
287
+ {p0, p0, sXLen , XLen},
288
+ {nxv2s8, p0, nxv2s8, 8 },
289
+ {nxv4s8, p0, nxv4s8, 8 },
290
+ {nxv8s8, p0, nxv8s8, 8 },
291
+ {nxv16s8, p0, nxv16s8, 8 },
292
+ {nxv32s8, p0, nxv32s8, 8 },
293
+ {nxv64s8, p0, nxv64s8, 8 },
294
+ {nxv2s16, p0, nxv2s16, 16 },
295
+ {nxv4s16, p0, nxv4s16, 16 },
296
+ {nxv8s16, p0, nxv8s16, 16 },
297
+ {nxv16s16, p0, nxv16s16, 16 },
298
+ {nxv32s16, p0, nxv32s16, 16 },
299
+ {nxv2s32, p0, nxv2s32, 32 },
300
+ {nxv4s32, p0, nxv4s32, 32 },
301
+ {nxv8s32, p0, nxv8s32, 32 },
302
+ {nxv16s32, p0, nxv16s32, 32 }});
285
303
286
304
auto &ExtLoadActions =
287
305
getActionDefinitionsBuilder ({G_SEXTLOAD, G_ZEXTLOAD})
@@ -309,10 +327,13 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
309
327
310
328
LoadStoreActions.widenScalarToNextPow2 (0 , /* MinSize = */ 8 )
311
329
.lowerIfMemSizeNotByteSizePow2 ()
312
- .customIf ([=](const LegalityQuery &Query) {
313
- LLT Type = Query.Types [0 ];
314
- return Type.isScalableVector ();
315
- })
330
+ .customIf (all (LegalityPredicate ([=](const LegalityQuery &Query) {
331
+ LLT Type = Query.Types [0 ];
332
+ return Type.isScalableVector ();
333
+ }),
334
+ LegalityPredicate (LegalityPredicates::any (
335
+ typeIsLegalIntOrFPVec (0 , IntOrFPVecTys, ST),
336
+ typeIsLegalPtrVec (0 , PtrVecTys, ST)))))
316
337
.clampScalar (0 , s32, sXLen )
317
338
.lower ();
318
339
@@ -690,28 +711,22 @@ bool RISCVLegalizerInfo::legalizeExt(MachineInstr &MI,
690
711
bool RISCVLegalizerInfo::legalizeLoadStore (MachineInstr &MI,
691
712
LegalizerHelper &Helper,
692
713
MachineIRBuilder &MIB) const {
714
+ assert ((isa<GLoad>(MI) || isa<GStore>(MI)) &&
715
+ " Machine instructions must be Load/Store." );
693
716
MachineRegisterInfo &MRI = *MIB.getMRI ();
694
717
MachineFunction *MF = MI.getMF ();
695
718
const DataLayout &DL = MIB.getDataLayout ();
696
719
LLVMContext &Ctx = MF->getFunction ().getContext ();
697
720
698
721
Register DstReg = MI.getOperand (0 ).getReg ();
699
- Register PtrReg = MI.getOperand (1 ).getReg ();
700
722
LLT DataTy = MRI.getType (DstReg);
701
723
if (!DataTy.isVector ())
702
724
return false ;
703
725
704
- if (!(STI.hasVInstructions () &&
705
- (DataTy.getScalarSizeInBits () != 64 || STI.hasVInstructionsI64 ()) &&
706
- (DataTy.getElementCount ().getKnownMinValue () != 1 ||
707
- STI.getELen () == 64 )))
708
- return false ;
709
-
710
726
if (!MI.hasOneMemOperand ())
711
727
return false ;
712
728
713
729
MachineMemOperand *MMO = *MI.memoperands_begin ();
714
- Align Alignment = MMO->getAlign ();
715
730
716
731
const auto *TLI = STI.getTargetLowering ();
717
732
EVT VT = EVT::getEVT (getTypeForLLT (DataTy, Ctx));
@@ -728,17 +743,10 @@ bool RISCVLegalizerInfo::legalizeLoadStore(MachineInstr &MI,
728
743
DataTy.getElementCount ().getKnownMinValue () * (EltSizeBits / 8 );
729
744
LLT NewDataTy = LLT::scalable_vector (NumElements, 8 );
730
745
731
- MachinePointerInfo PI = MMO->getPointerInfo ();
732
- MachineMemOperand *NewMMO =
733
- MF->getMachineMemOperand (PI, MMO->getFlags (), NewDataTy, Alignment);
734
-
735
- if (isa<GLoad>(MI)) {
746
+ if (isa<GLoad>(MI))
736
747
Helper.bitcast (MI, 0 , NewDataTy);
737
- } else {
738
- assert (isa<GStore>(MI) && " Machine instructions must be Load/Store." );
748
+ else
739
749
Helper.bitcast (MI, 0 , NewDataTy);
740
- MIB.buildStore (MI.getOperand (0 ), PtrReg, *NewMMO);
741
- }
742
750
743
751
return true ;
744
752
}
0 commit comments