@@ -156,100 +156,6 @@ LegalizerHelper::legalizeInstrStep(MachineInstr &MI,
156
156
}
157
157
}
158
158
159
- void LegalizerHelper::extractParts (Register Reg, LLT Ty, int NumParts,
160
- SmallVectorImpl<Register> &VRegs) {
161
- for (int i = 0 ; i < NumParts; ++i)
162
- VRegs.push_back (MRI.createGenericVirtualRegister (Ty));
163
- MIRBuilder.buildUnmerge (VRegs, Reg);
164
- }
165
-
166
- bool LegalizerHelper::extractParts (Register Reg, LLT RegTy,
167
- LLT MainTy, LLT &LeftoverTy,
168
- SmallVectorImpl<Register> &VRegs,
169
- SmallVectorImpl<Register> &LeftoverRegs) {
170
- assert (!LeftoverTy.isValid () && " this is an out argument" );
171
-
172
- unsigned RegSize = RegTy.getSizeInBits ();
173
- unsigned MainSize = MainTy.getSizeInBits ();
174
- unsigned NumParts = RegSize / MainSize;
175
- unsigned LeftoverSize = RegSize - NumParts * MainSize;
176
-
177
- // Use an unmerge when possible.
178
- if (LeftoverSize == 0 ) {
179
- for (unsigned I = 0 ; I < NumParts; ++I)
180
- VRegs.push_back (MRI.createGenericVirtualRegister (MainTy));
181
- MIRBuilder.buildUnmerge (VRegs, Reg);
182
- return true ;
183
- }
184
-
185
- // Perform irregular split. Leftover is last element of RegPieces.
186
- if (MainTy.isVector ()) {
187
- SmallVector<Register, 8 > RegPieces;
188
- extractVectorParts (Reg, MainTy.getNumElements (), RegPieces);
189
- for (unsigned i = 0 ; i < RegPieces.size () - 1 ; ++i)
190
- VRegs.push_back (RegPieces[i]);
191
- LeftoverRegs.push_back (RegPieces[RegPieces.size () - 1 ]);
192
- LeftoverTy = MRI.getType (LeftoverRegs[0 ]);
193
- return true ;
194
- }
195
-
196
- LeftoverTy = LLT::scalar (LeftoverSize);
197
- // For irregular sizes, extract the individual parts.
198
- for (unsigned I = 0 ; I != NumParts; ++I) {
199
- Register NewReg = MRI.createGenericVirtualRegister (MainTy);
200
- VRegs.push_back (NewReg);
201
- MIRBuilder.buildExtract (NewReg, Reg, MainSize * I);
202
- }
203
-
204
- for (unsigned Offset = MainSize * NumParts; Offset < RegSize;
205
- Offset += LeftoverSize) {
206
- Register NewReg = MRI.createGenericVirtualRegister (LeftoverTy);
207
- LeftoverRegs.push_back (NewReg);
208
- MIRBuilder.buildExtract (NewReg, Reg, Offset);
209
- }
210
-
211
- return true ;
212
- }
213
-
214
- void LegalizerHelper::extractVectorParts (Register Reg, unsigned NumElts,
215
- SmallVectorImpl<Register> &VRegs) {
216
- LLT RegTy = MRI.getType (Reg);
217
- assert (RegTy.isVector () && " Expected a vector type" );
218
-
219
- LLT EltTy = RegTy.getElementType ();
220
- LLT NarrowTy = (NumElts == 1 ) ? EltTy : LLT::fixed_vector (NumElts, EltTy);
221
- unsigned RegNumElts = RegTy.getNumElements ();
222
- unsigned LeftoverNumElts = RegNumElts % NumElts;
223
- unsigned NumNarrowTyPieces = RegNumElts / NumElts;
224
-
225
- // Perfect split without leftover
226
- if (LeftoverNumElts == 0 )
227
- return extractParts (Reg, NarrowTy, NumNarrowTyPieces, VRegs);
228
-
229
- // Irregular split. Provide direct access to all elements for artifact
230
- // combiner using unmerge to elements. Then build vectors with NumElts
231
- // elements. Remaining element(s) will be (used to build vector) Leftover.
232
- SmallVector<Register, 8 > Elts;
233
- extractParts (Reg, EltTy, RegNumElts, Elts);
234
-
235
- unsigned Offset = 0 ;
236
- // Requested sub-vectors of NarrowTy.
237
- for (unsigned i = 0 ; i < NumNarrowTyPieces; ++i, Offset += NumElts) {
238
- ArrayRef<Register> Pieces (&Elts[Offset], NumElts);
239
- VRegs.push_back (MIRBuilder.buildMergeLikeInstr (NarrowTy, Pieces).getReg (0 ));
240
- }
241
-
242
- // Leftover element(s).
243
- if (LeftoverNumElts == 1 ) {
244
- VRegs.push_back (Elts[Offset]);
245
- } else {
246
- LLT LeftoverTy = LLT::fixed_vector (LeftoverNumElts, EltTy);
247
- ArrayRef<Register> Pieces (&Elts[Offset], LeftoverNumElts);
248
- VRegs.push_back (
249
- MIRBuilder.buildMergeLikeInstr (LeftoverTy, Pieces).getReg (0 ));
250
- }
251
- }
252
-
253
159
void LegalizerHelper::insertParts (Register DstReg,
254
160
LLT ResultTy, LLT PartTy,
255
161
ArrayRef<Register> PartRegs,
@@ -291,7 +197,8 @@ void LegalizerHelper::appendVectorElts(SmallVectorImpl<Register> &Elts,
291
197
Register Reg) {
292
198
LLT Ty = MRI.getType (Reg);
293
199
SmallVector<Register, 8 > RegElts;
294
- extractParts (Reg, Ty.getScalarType (), Ty.getNumElements (), RegElts);
200
+ extractParts (Reg, Ty.getScalarType (), Ty.getNumElements (), RegElts,
201
+ MIRBuilder, MRI);
295
202
Elts.append (RegElts);
296
203
}
297
204
@@ -1330,7 +1237,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
1330
1237
MachineBasicBlock &OpMBB = *MI.getOperand (i + 1 ).getMBB ();
1331
1238
MIRBuilder.setInsertPt (OpMBB, OpMBB.getFirstTerminatorForward ());
1332
1239
extractParts (MI.getOperand (i).getReg (), NarrowTy, NumParts,
1333
- SrcRegs[i / 2 ]);
1240
+ SrcRegs[i / 2 ], MIRBuilder, MRI );
1334
1241
}
1335
1242
MachineBasicBlock &MBB = *MI.getParent ();
1336
1243
MIRBuilder.setInsertPt (MBB, MI);
@@ -1372,13 +1279,13 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
1372
1279
LLT LeftoverTy; // Example: s88 -> s64 (NarrowTy) + s24 (leftover)
1373
1280
SmallVector<Register, 4 > LHSPartRegs, LHSLeftoverRegs;
1374
1281
if (!extractParts (LHS, SrcTy, NarrowTy, LeftoverTy, LHSPartRegs,
1375
- LHSLeftoverRegs))
1282
+ LHSLeftoverRegs, MIRBuilder, MRI ))
1376
1283
return UnableToLegalize;
1377
1284
1378
1285
LLT Unused; // Matches LeftoverTy; G_ICMP LHS and RHS are the same type.
1379
1286
SmallVector<Register, 4 > RHSPartRegs, RHSLeftoverRegs;
1380
1287
if (!extractParts (MI.getOperand (3 ).getReg (), SrcTy, NarrowTy, Unused,
1381
- RHSPartRegs, RHSLeftoverRegs))
1288
+ RHSPartRegs, RHSLeftoverRegs, MIRBuilder, MRI ))
1382
1289
return UnableToLegalize;
1383
1290
1384
1291
// We now have the LHS and RHS of the compare split into narrow-type
@@ -1532,7 +1439,8 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
1532
1439
Observer.changingInstr (MI);
1533
1440
SmallVector<Register, 2 > SrcRegs, DstRegs;
1534
1441
unsigned NumParts = SizeOp0 / NarrowSize;
1535
- extractParts (MI.getOperand (1 ).getReg (), NarrowTy, NumParts, SrcRegs);
1442
+ extractParts (MI.getOperand (1 ).getReg (), NarrowTy, NumParts, SrcRegs,
1443
+ MIRBuilder, MRI);
1536
1444
1537
1445
for (unsigned i = 0 ; i < NumParts; ++i) {
1538
1446
auto DstPart = MIRBuilder.buildInstr (MI.getOpcode (), {NarrowTy},
@@ -3981,7 +3889,8 @@ LegalizerHelper::fewerElementsVectorMultiEltType(
3981
3889
MI.getOperand (UseIdx));
3982
3890
} else {
3983
3891
SmallVector<Register, 8 > SplitPieces;
3984
- extractVectorParts (MI.getReg (UseIdx), NumElts, SplitPieces);
3892
+ extractVectorParts (MI.getReg (UseIdx), NumElts, SplitPieces, MIRBuilder,
3893
+ MRI);
3985
3894
for (auto Reg : SplitPieces)
3986
3895
InputOpsPieces[UseNo].push_back (Reg);
3987
3896
}
@@ -4037,7 +3946,8 @@ LegalizerHelper::fewerElementsVectorPhi(GenericMachineInstr &MI,
4037
3946
UseIdx += 2 , ++UseNo) {
4038
3947
MachineBasicBlock &OpMBB = *MI.getOperand (UseIdx + 1 ).getMBB ();
4039
3948
MIRBuilder.setInsertPt (OpMBB, OpMBB.getFirstTerminatorForward ());
4040
- extractVectorParts (MI.getReg (UseIdx), NumElts, InputOpsPieces[UseNo]);
3949
+ extractVectorParts (MI.getReg (UseIdx), NumElts, InputOpsPieces[UseNo],
3950
+ MIRBuilder, MRI);
4041
3951
}
4042
3952
4043
3953
// Build PHIs with fewer elements.
@@ -4306,7 +4216,7 @@ LegalizerHelper::reduceLoadStoreWidth(GLoadStore &LdStMI, unsigned TypeIdx,
4306
4216
std::tie (NumParts, NumLeftover) = getNarrowTypeBreakDown (ValTy, NarrowTy, LeftoverTy);
4307
4217
} else {
4308
4218
if (extractParts (ValReg, ValTy, NarrowTy, LeftoverTy, NarrowRegs,
4309
- NarrowLeftoverRegs)) {
4219
+ NarrowLeftoverRegs, MIRBuilder, MRI )) {
4310
4220
NumParts = NarrowRegs.size ();
4311
4221
NumLeftover = NarrowLeftoverRegs.size ();
4312
4222
}
@@ -4547,8 +4457,8 @@ LegalizerHelper::LegalizeResult LegalizerHelper::fewerElementsVectorShuffle(
4547
4457
unsigned NewElts = NarrowTy.getNumElements ();
4548
4458
4549
4459
SmallVector<Register> SplitSrc1Regs, SplitSrc2Regs;
4550
- extractParts (Src1Reg, NarrowTy, 2 , SplitSrc1Regs);
4551
- extractParts (Src2Reg, NarrowTy, 2 , SplitSrc2Regs);
4460
+ extractParts (Src1Reg, NarrowTy, 2 , SplitSrc1Regs, MIRBuilder, MRI );
4461
+ extractParts (Src2Reg, NarrowTy, 2 , SplitSrc2Regs, MIRBuilder, MRI );
4552
4462
Register Inputs[4 ] = {SplitSrc1Regs[0 ], SplitSrc1Regs[1 ], SplitSrc2Regs[0 ],
4553
4463
SplitSrc2Regs[1 ]};
4554
4464
@@ -4682,7 +4592,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::fewerElementsVectorReductions(
4682
4592
NarrowTy.isVector () ? SrcTy.getNumElements () / NarrowTy.getNumElements ()
4683
4593
: SrcTy.getNumElements ();
4684
4594
4685
- extractParts (SrcReg, NarrowTy, NumParts, SplitSrcs);
4595
+ extractParts (SrcReg, NarrowTy, NumParts, SplitSrcs, MIRBuilder, MRI );
4686
4596
if (NarrowTy.isScalar ()) {
4687
4597
if (DstTy != NarrowTy)
4688
4598
return UnableToLegalize; // FIXME: handle implicit extensions.
@@ -4753,7 +4663,8 @@ LegalizerHelper::tryNarrowPow2Reduction(MachineInstr &MI, Register SrcReg,
4753
4663
SmallVector<Register> SplitSrcs;
4754
4664
// Split the sources into NarrowTy size pieces.
4755
4665
extractParts (SrcReg, NarrowTy,
4756
- SrcTy.getNumElements () / NarrowTy.getNumElements (), SplitSrcs);
4666
+ SrcTy.getNumElements () / NarrowTy.getNumElements (), SplitSrcs,
4667
+ MIRBuilder, MRI);
4757
4668
// We're going to do a tree reduction using vector operations until we have
4758
4669
// one NarrowTy size value left.
4759
4670
while (SplitSrcs.size () > 1 ) {
@@ -5392,8 +5303,10 @@ LegalizerHelper::narrowScalarAddSub(MachineInstr &MI, unsigned TypeIdx,
5392
5303
LLT RegTy = MRI.getType (MI.getOperand (0 ).getReg ());
5393
5304
LLT LeftoverTy, DummyTy;
5394
5305
SmallVector<Register, 2 > Src1Regs, Src2Regs, Src1Left, Src2Left, DstRegs;
5395
- extractParts (Src1, RegTy, NarrowTy, LeftoverTy, Src1Regs, Src1Left);
5396
- extractParts (Src2, RegTy, NarrowTy, DummyTy, Src2Regs, Src2Left);
5306
+ extractParts (Src1, RegTy, NarrowTy, LeftoverTy, Src1Regs, Src1Left,
5307
+ MIRBuilder, MRI);
5308
+ extractParts (Src2, RegTy, NarrowTy, DummyTy, Src2Regs, Src2Left, MIRBuilder,
5309
+ MRI);
5397
5310
5398
5311
int NarrowParts = Src1Regs.size ();
5399
5312
for (int I = 0 , E = Src1Left.size (); I != E; ++I) {
@@ -5451,8 +5364,8 @@ LegalizerHelper::narrowScalarMul(MachineInstr &MI, LLT NarrowTy) {
5451
5364
5452
5365
SmallVector<Register, 2 > Src1Parts, Src2Parts;
5453
5366
SmallVector<Register, 2 > DstTmpRegs (DstTmpParts);
5454
- extractParts (Src1, NarrowTy, NumParts, Src1Parts);
5455
- extractParts (Src2, NarrowTy, NumParts, Src2Parts);
5367
+ extractParts (Src1, NarrowTy, NumParts, Src1Parts, MIRBuilder, MRI );
5368
+ extractParts (Src2, NarrowTy, NumParts, Src2Parts, MIRBuilder, MRI );
5456
5369
multiplyRegisters (DstTmpRegs, Src1Parts, Src2Parts, NarrowTy);
5457
5370
5458
5371
// Take only high half of registers if this is high mul.
@@ -5504,7 +5417,8 @@ LegalizerHelper::narrowScalarExtract(MachineInstr &MI, unsigned TypeIdx,
5504
5417
5505
5418
SmallVector<Register, 2 > SrcRegs, DstRegs;
5506
5419
SmallVector<uint64_t , 2 > Indexes;
5507
- extractParts (MI.getOperand (1 ).getReg (), NarrowTy, NumParts, SrcRegs);
5420
+ extractParts (MI.getOperand (1 ).getReg (), NarrowTy, NumParts, SrcRegs,
5421
+ MIRBuilder, MRI);
5508
5422
5509
5423
Register OpReg = MI.getOperand (0 ).getReg ();
5510
5424
uint64_t OpStart = MI.getOperand (2 ).getImm ();
@@ -5566,7 +5480,7 @@ LegalizerHelper::narrowScalarInsert(MachineInstr &MI, unsigned TypeIdx,
5566
5480
LLT RegTy = MRI.getType (MI.getOperand (0 ).getReg ());
5567
5481
LLT LeftoverTy;
5568
5482
extractParts (MI.getOperand (1 ).getReg (), RegTy, NarrowTy, LeftoverTy, SrcRegs,
5569
- LeftoverRegs);
5483
+ LeftoverRegs, MIRBuilder, MRI );
5570
5484
5571
5485
for (Register Reg : LeftoverRegs)
5572
5486
SrcRegs.push_back (Reg);
@@ -5651,12 +5565,12 @@ LegalizerHelper::narrowScalarBasic(MachineInstr &MI, unsigned TypeIdx,
5651
5565
SmallVector<Register, 4 > Src1Regs, Src1LeftoverRegs;
5652
5566
LLT LeftoverTy;
5653
5567
if (!extractParts (MI.getOperand (1 ).getReg (), DstTy, NarrowTy, LeftoverTy,
5654
- Src0Regs, Src0LeftoverRegs))
5568
+ Src0Regs, Src0LeftoverRegs, MIRBuilder, MRI ))
5655
5569
return UnableToLegalize;
5656
5570
5657
5571
LLT Unused;
5658
5572
if (!extractParts (MI.getOperand (2 ).getReg (), DstTy, NarrowTy, Unused,
5659
- Src1Regs, Src1LeftoverRegs))
5573
+ Src1Regs, Src1LeftoverRegs, MIRBuilder, MRI ))
5660
5574
llvm_unreachable (" inconsistent extractParts result" );
5661
5575
5662
5576
for (unsigned I = 0 , E = Src1Regs.size (); I != E; ++I) {
@@ -5719,12 +5633,12 @@ LegalizerHelper::narrowScalarSelect(MachineInstr &MI, unsigned TypeIdx,
5719
5633
SmallVector<Register, 4 > Src2Regs, Src2LeftoverRegs;
5720
5634
LLT LeftoverTy;
5721
5635
if (!extractParts (MI.getOperand (2 ).getReg (), DstTy, NarrowTy, LeftoverTy,
5722
- Src1Regs, Src1LeftoverRegs))
5636
+ Src1Regs, Src1LeftoverRegs, MIRBuilder, MRI ))
5723
5637
return UnableToLegalize;
5724
5638
5725
5639
LLT Unused;
5726
5640
if (!extractParts (MI.getOperand (3 ).getReg (), DstTy, NarrowTy, Unused,
5727
- Src2Regs, Src2LeftoverRegs))
5641
+ Src2Regs, Src2LeftoverRegs, MIRBuilder, MRI ))
5728
5642
llvm_unreachable (" inconsistent extractParts result" );
5729
5643
5730
5644
for (unsigned I = 0 , E = Src1Regs.size (); I != E; ++I) {
@@ -6220,7 +6134,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerTRUNC(MachineInstr &MI) {
6220
6134
6221
6135
// First, split the source into two smaller vectors.
6222
6136
SmallVector<Register, 2 > SplitSrcs;
6223
- extractParts (SrcReg, SplitSrcTy, 2 , SplitSrcs);
6137
+ extractParts (SrcReg, SplitSrcTy, 2 , SplitSrcs, MIRBuilder, MRI );
6224
6138
6225
6139
// Truncate the splits into intermediate narrower elements.
6226
6140
LLT InterTy;
@@ -6960,7 +6874,7 @@ LegalizerHelper::lowerExtractInsertVectorElt(MachineInstr &MI) {
6960
6874
int64_t IdxVal;
6961
6875
if (mi_match (Idx, MRI, m_ICst (IdxVal)) && IdxVal <= NumElts) {
6962
6876
SmallVector<Register, 8 > SrcRegs;
6963
- extractParts (SrcVec, EltTy, NumElts, SrcRegs);
6877
+ extractParts (SrcVec, EltTy, NumElts, SrcRegs, MIRBuilder, MRI );
6964
6878
6965
6879
if (InsertVal) {
6966
6880
SrcRegs[IdxVal] = MI.getOperand (2 ).getReg ();
0 commit comments