@@ -158,100 +158,6 @@ LegalizerHelper::legalizeInstrStep(MachineInstr &MI,
158
158
}
159
159
}
160
160
161
- void LegalizerHelper::extractParts (Register Reg, LLT Ty, int NumParts,
162
- SmallVectorImpl<Register> &VRegs) {
163
- for (int i = 0 ; i < NumParts; ++i)
164
- VRegs.push_back (MRI.createGenericVirtualRegister (Ty));
165
- MIRBuilder.buildUnmerge (VRegs, Reg);
166
- }
167
-
168
- bool LegalizerHelper::extractParts (Register Reg, LLT RegTy,
169
- LLT MainTy, LLT &LeftoverTy,
170
- SmallVectorImpl<Register> &VRegs,
171
- SmallVectorImpl<Register> &LeftoverRegs) {
172
- assert (!LeftoverTy.isValid () && " this is an out argument" );
173
-
174
- unsigned RegSize = RegTy.getSizeInBits ();
175
- unsigned MainSize = MainTy.getSizeInBits ();
176
- unsigned NumParts = RegSize / MainSize;
177
- unsigned LeftoverSize = RegSize - NumParts * MainSize;
178
-
179
- // Use an unmerge when possible.
180
- if (LeftoverSize == 0 ) {
181
- for (unsigned I = 0 ; I < NumParts; ++I)
182
- VRegs.push_back (MRI.createGenericVirtualRegister (MainTy));
183
- MIRBuilder.buildUnmerge (VRegs, Reg);
184
- return true ;
185
- }
186
-
187
- // Perform irregular split. Leftover is last element of RegPieces.
188
- if (MainTy.isVector ()) {
189
- SmallVector<Register, 8 > RegPieces;
190
- extractVectorParts (Reg, MainTy.getNumElements (), RegPieces);
191
- for (unsigned i = 0 ; i < RegPieces.size () - 1 ; ++i)
192
- VRegs.push_back (RegPieces[i]);
193
- LeftoverRegs.push_back (RegPieces[RegPieces.size () - 1 ]);
194
- LeftoverTy = MRI.getType (LeftoverRegs[0 ]);
195
- return true ;
196
- }
197
-
198
- LeftoverTy = LLT::scalar (LeftoverSize);
199
- // For irregular sizes, extract the individual parts.
200
- for (unsigned I = 0 ; I != NumParts; ++I) {
201
- Register NewReg = MRI.createGenericVirtualRegister (MainTy);
202
- VRegs.push_back (NewReg);
203
- MIRBuilder.buildExtract (NewReg, Reg, MainSize * I);
204
- }
205
-
206
- for (unsigned Offset = MainSize * NumParts; Offset < RegSize;
207
- Offset += LeftoverSize) {
208
- Register NewReg = MRI.createGenericVirtualRegister (LeftoverTy);
209
- LeftoverRegs.push_back (NewReg);
210
- MIRBuilder.buildExtract (NewReg, Reg, Offset);
211
- }
212
-
213
- return true ;
214
- }
215
-
216
- void LegalizerHelper::extractVectorParts (Register Reg, unsigned NumElts,
217
- SmallVectorImpl<Register> &VRegs) {
218
- LLT RegTy = MRI.getType (Reg);
219
- assert (RegTy.isVector () && " Expected a vector type" );
220
-
221
- LLT EltTy = RegTy.getElementType ();
222
- LLT NarrowTy = (NumElts == 1 ) ? EltTy : LLT::fixed_vector (NumElts, EltTy);
223
- unsigned RegNumElts = RegTy.getNumElements ();
224
- unsigned LeftoverNumElts = RegNumElts % NumElts;
225
- unsigned NumNarrowTyPieces = RegNumElts / NumElts;
226
-
227
- // Perfect split without leftover
228
- if (LeftoverNumElts == 0 )
229
- return extractParts (Reg, NarrowTy, NumNarrowTyPieces, VRegs);
230
-
231
- // Irregular split. Provide direct access to all elements for artifact
232
- // combiner using unmerge to elements. Then build vectors with NumElts
233
- // elements. Remaining element(s) will be (used to build vector) Leftover.
234
- SmallVector<Register, 8 > Elts;
235
- extractParts (Reg, EltTy, RegNumElts, Elts);
236
-
237
- unsigned Offset = 0 ;
238
- // Requested sub-vectors of NarrowTy.
239
- for (unsigned i = 0 ; i < NumNarrowTyPieces; ++i, Offset += NumElts) {
240
- ArrayRef<Register> Pieces (&Elts[Offset], NumElts);
241
- VRegs.push_back (MIRBuilder.buildMergeLikeInstr (NarrowTy, Pieces).getReg (0 ));
242
- }
243
-
244
- // Leftover element(s).
245
- if (LeftoverNumElts == 1 ) {
246
- VRegs.push_back (Elts[Offset]);
247
- } else {
248
- LLT LeftoverTy = LLT::fixed_vector (LeftoverNumElts, EltTy);
249
- ArrayRef<Register> Pieces (&Elts[Offset], LeftoverNumElts);
250
- VRegs.push_back (
251
- MIRBuilder.buildMergeLikeInstr (LeftoverTy, Pieces).getReg (0 ));
252
- }
253
- }
254
-
255
161
void LegalizerHelper::insertParts (Register DstReg,
256
162
LLT ResultTy, LLT PartTy,
257
163
ArrayRef<Register> PartRegs,
@@ -293,7 +199,8 @@ void LegalizerHelper::appendVectorElts(SmallVectorImpl<Register> &Elts,
293
199
Register Reg) {
294
200
LLT Ty = MRI.getType (Reg);
295
201
SmallVector<Register, 8 > RegElts;
296
- extractParts (Reg, Ty.getScalarType (), Ty.getNumElements (), RegElts);
202
+ extractParts (Reg, Ty.getScalarType (), Ty.getNumElements (), RegElts,
203
+ MIRBuilder, MRI);
297
204
Elts.append (RegElts);
298
205
}
299
206
@@ -1542,7 +1449,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
1542
1449
MachineBasicBlock &OpMBB = *MI.getOperand (i + 1 ).getMBB ();
1543
1450
MIRBuilder.setInsertPt (OpMBB, OpMBB.getFirstTerminatorForward ());
1544
1451
extractParts (MI.getOperand (i).getReg (), NarrowTy, NumParts,
1545
- SrcRegs[i / 2 ]);
1452
+ SrcRegs[i / 2 ], MIRBuilder, MRI );
1546
1453
}
1547
1454
MachineBasicBlock &MBB = *MI.getParent ();
1548
1455
MIRBuilder.setInsertPt (MBB, MI);
@@ -1584,13 +1491,13 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
1584
1491
LLT LeftoverTy; // Example: s88 -> s64 (NarrowTy) + s24 (leftover)
1585
1492
SmallVector<Register, 4 > LHSPartRegs, LHSLeftoverRegs;
1586
1493
if (!extractParts (LHS, SrcTy, NarrowTy, LeftoverTy, LHSPartRegs,
1587
- LHSLeftoverRegs))
1494
+ LHSLeftoverRegs, MIRBuilder, MRI ))
1588
1495
return UnableToLegalize;
1589
1496
1590
1497
LLT Unused; // Matches LeftoverTy; G_ICMP LHS and RHS are the same type.
1591
1498
SmallVector<Register, 4 > RHSPartRegs, RHSLeftoverRegs;
1592
1499
if (!extractParts (MI.getOperand (3 ).getReg (), SrcTy, NarrowTy, Unused,
1593
- RHSPartRegs, RHSLeftoverRegs))
1500
+ RHSPartRegs, RHSLeftoverRegs, MIRBuilder, MRI ))
1594
1501
return UnableToLegalize;
1595
1502
1596
1503
// We now have the LHS and RHS of the compare split into narrow-type
@@ -1744,7 +1651,8 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
1744
1651
Observer.changingInstr (MI);
1745
1652
SmallVector<Register, 2 > SrcRegs, DstRegs;
1746
1653
unsigned NumParts = SizeOp0 / NarrowSize;
1747
- extractParts (MI.getOperand (1 ).getReg (), NarrowTy, NumParts, SrcRegs);
1654
+ extractParts (MI.getOperand (1 ).getReg (), NarrowTy, NumParts, SrcRegs,
1655
+ MIRBuilder, MRI);
1748
1656
1749
1657
for (unsigned i = 0 ; i < NumParts; ++i) {
1750
1658
auto DstPart = MIRBuilder.buildInstr (MI.getOpcode (), {NarrowTy},
@@ -4194,7 +4102,8 @@ LegalizerHelper::fewerElementsVectorMultiEltType(
4194
4102
MI.getOperand (UseIdx));
4195
4103
} else {
4196
4104
SmallVector<Register, 8 > SplitPieces;
4197
- extractVectorParts (MI.getReg (UseIdx), NumElts, SplitPieces);
4105
+ extractVectorParts (MI.getReg (UseIdx), NumElts, SplitPieces, MIRBuilder,
4106
+ MRI);
4198
4107
for (auto Reg : SplitPieces)
4199
4108
InputOpsPieces[UseNo].push_back (Reg);
4200
4109
}
@@ -4250,7 +4159,8 @@ LegalizerHelper::fewerElementsVectorPhi(GenericMachineInstr &MI,
4250
4159
UseIdx += 2 , ++UseNo) {
4251
4160
MachineBasicBlock &OpMBB = *MI.getOperand (UseIdx + 1 ).getMBB ();
4252
4161
MIRBuilder.setInsertPt (OpMBB, OpMBB.getFirstTerminatorForward ());
4253
- extractVectorParts (MI.getReg (UseIdx), NumElts, InputOpsPieces[UseNo]);
4162
+ extractVectorParts (MI.getReg (UseIdx), NumElts, InputOpsPieces[UseNo],
4163
+ MIRBuilder, MRI);
4254
4164
}
4255
4165
4256
4166
// Build PHIs with fewer elements.
@@ -4519,7 +4429,7 @@ LegalizerHelper::reduceLoadStoreWidth(GLoadStore &LdStMI, unsigned TypeIdx,
4519
4429
std::tie (NumParts, NumLeftover) = getNarrowTypeBreakDown (ValTy, NarrowTy, LeftoverTy);
4520
4430
} else {
4521
4431
if (extractParts (ValReg, ValTy, NarrowTy, LeftoverTy, NarrowRegs,
4522
- NarrowLeftoverRegs)) {
4432
+ NarrowLeftoverRegs, MIRBuilder, MRI )) {
4523
4433
NumParts = NarrowRegs.size ();
4524
4434
NumLeftover = NarrowLeftoverRegs.size ();
4525
4435
}
@@ -4765,8 +4675,8 @@ LegalizerHelper::LegalizeResult LegalizerHelper::fewerElementsVectorShuffle(
4765
4675
unsigned NewElts = NarrowTy.getNumElements ();
4766
4676
4767
4677
SmallVector<Register> SplitSrc1Regs, SplitSrc2Regs;
4768
- extractParts (Src1Reg, NarrowTy, 2 , SplitSrc1Regs);
4769
- extractParts (Src2Reg, NarrowTy, 2 , SplitSrc2Regs);
4678
+ extractParts (Src1Reg, NarrowTy, 2 , SplitSrc1Regs, MIRBuilder, MRI );
4679
+ extractParts (Src2Reg, NarrowTy, 2 , SplitSrc2Regs, MIRBuilder, MRI );
4770
4680
Register Inputs[4 ] = {SplitSrc1Regs[0 ], SplitSrc1Regs[1 ], SplitSrc2Regs[0 ],
4771
4681
SplitSrc2Regs[1 ]};
4772
4682
@@ -4900,7 +4810,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::fewerElementsVectorReductions(
4900
4810
NarrowTy.isVector () ? SrcTy.getNumElements () / NarrowTy.getNumElements ()
4901
4811
: SrcTy.getNumElements ();
4902
4812
4903
- extractParts (SrcReg, NarrowTy, NumParts, SplitSrcs);
4813
+ extractParts (SrcReg, NarrowTy, NumParts, SplitSrcs, MIRBuilder, MRI );
4904
4814
if (NarrowTy.isScalar ()) {
4905
4815
if (DstTy != NarrowTy)
4906
4816
return UnableToLegalize; // FIXME: handle implicit extensions.
@@ -4983,7 +4893,7 @@ LegalizerHelper::fewerElementsVectorSeqReductions(MachineInstr &MI,
4983
4893
4984
4894
SmallVector<Register> SplitSrcs;
4985
4895
unsigned NumParts = SrcTy.getNumElements ();
4986
- extractParts (SrcReg, NarrowTy, NumParts, SplitSrcs);
4896
+ extractParts (SrcReg, NarrowTy, NumParts, SplitSrcs, MIRBuilder, MRI );
4987
4897
Register Acc = ScalarReg;
4988
4898
for (unsigned i = 0 ; i < NumParts; i++)
4989
4899
Acc = MIRBuilder.buildInstr (ScalarOpc, {NarrowTy}, {Acc, SplitSrcs[i]})
@@ -5001,7 +4911,8 @@ LegalizerHelper::tryNarrowPow2Reduction(MachineInstr &MI, Register SrcReg,
5001
4911
SmallVector<Register> SplitSrcs;
5002
4912
// Split the sources into NarrowTy size pieces.
5003
4913
extractParts (SrcReg, NarrowTy,
5004
- SrcTy.getNumElements () / NarrowTy.getNumElements (), SplitSrcs);
4914
+ SrcTy.getNumElements () / NarrowTy.getNumElements (), SplitSrcs,
4915
+ MIRBuilder, MRI);
5005
4916
// We're going to do a tree reduction using vector operations until we have
5006
4917
// one NarrowTy size value left.
5007
4918
while (SplitSrcs.size () > 1 ) {
@@ -5640,8 +5551,10 @@ LegalizerHelper::narrowScalarAddSub(MachineInstr &MI, unsigned TypeIdx,
5640
5551
LLT RegTy = MRI.getType (MI.getOperand (0 ).getReg ());
5641
5552
LLT LeftoverTy, DummyTy;
5642
5553
SmallVector<Register, 2 > Src1Regs, Src2Regs, Src1Left, Src2Left, DstRegs;
5643
- extractParts (Src1, RegTy, NarrowTy, LeftoverTy, Src1Regs, Src1Left);
5644
- extractParts (Src2, RegTy, NarrowTy, DummyTy, Src2Regs, Src2Left);
5554
+ extractParts (Src1, RegTy, NarrowTy, LeftoverTy, Src1Regs, Src1Left,
5555
+ MIRBuilder, MRI);
5556
+ extractParts (Src2, RegTy, NarrowTy, DummyTy, Src2Regs, Src2Left, MIRBuilder,
5557
+ MRI);
5645
5558
5646
5559
int NarrowParts = Src1Regs.size ();
5647
5560
for (int I = 0 , E = Src1Left.size (); I != E; ++I) {
@@ -5699,8 +5612,8 @@ LegalizerHelper::narrowScalarMul(MachineInstr &MI, LLT NarrowTy) {
5699
5612
5700
5613
SmallVector<Register, 2 > Src1Parts, Src2Parts;
5701
5614
SmallVector<Register, 2 > DstTmpRegs (DstTmpParts);
5702
- extractParts (Src1, NarrowTy, NumParts, Src1Parts);
5703
- extractParts (Src2, NarrowTy, NumParts, Src2Parts);
5615
+ extractParts (Src1, NarrowTy, NumParts, Src1Parts, MIRBuilder, MRI );
5616
+ extractParts (Src2, NarrowTy, NumParts, Src2Parts, MIRBuilder, MRI );
5704
5617
multiplyRegisters (DstTmpRegs, Src1Parts, Src2Parts, NarrowTy);
5705
5618
5706
5619
// Take only high half of registers if this is high mul.
@@ -5752,7 +5665,8 @@ LegalizerHelper::narrowScalarExtract(MachineInstr &MI, unsigned TypeIdx,
5752
5665
5753
5666
SmallVector<Register, 2 > SrcRegs, DstRegs;
5754
5667
SmallVector<uint64_t , 2 > Indexes;
5755
- extractParts (MI.getOperand (1 ).getReg (), NarrowTy, NumParts, SrcRegs);
5668
+ extractParts (MI.getOperand (1 ).getReg (), NarrowTy, NumParts, SrcRegs,
5669
+ MIRBuilder, MRI);
5756
5670
5757
5671
Register OpReg = MI.getOperand (0 ).getReg ();
5758
5672
uint64_t OpStart = MI.getOperand (2 ).getImm ();
@@ -5814,7 +5728,7 @@ LegalizerHelper::narrowScalarInsert(MachineInstr &MI, unsigned TypeIdx,
5814
5728
LLT RegTy = MRI.getType (MI.getOperand (0 ).getReg ());
5815
5729
LLT LeftoverTy;
5816
5730
extractParts (MI.getOperand (1 ).getReg (), RegTy, NarrowTy, LeftoverTy, SrcRegs,
5817
- LeftoverRegs);
5731
+ LeftoverRegs, MIRBuilder, MRI );
5818
5732
5819
5733
for (Register Reg : LeftoverRegs)
5820
5734
SrcRegs.push_back (Reg);
@@ -5899,12 +5813,12 @@ LegalizerHelper::narrowScalarBasic(MachineInstr &MI, unsigned TypeIdx,
5899
5813
SmallVector<Register, 4 > Src1Regs, Src1LeftoverRegs;
5900
5814
LLT LeftoverTy;
5901
5815
if (!extractParts (MI.getOperand (1 ).getReg (), DstTy, NarrowTy, LeftoverTy,
5902
- Src0Regs, Src0LeftoverRegs))
5816
+ Src0Regs, Src0LeftoverRegs, MIRBuilder, MRI ))
5903
5817
return UnableToLegalize;
5904
5818
5905
5819
LLT Unused;
5906
5820
if (!extractParts (MI.getOperand (2 ).getReg (), DstTy, NarrowTy, Unused,
5907
- Src1Regs, Src1LeftoverRegs))
5821
+ Src1Regs, Src1LeftoverRegs, MIRBuilder, MRI ))
5908
5822
llvm_unreachable (" inconsistent extractParts result" );
5909
5823
5910
5824
for (unsigned I = 0 , E = Src1Regs.size (); I != E; ++I) {
@@ -5967,12 +5881,12 @@ LegalizerHelper::narrowScalarSelect(MachineInstr &MI, unsigned TypeIdx,
5967
5881
SmallVector<Register, 4 > Src2Regs, Src2LeftoverRegs;
5968
5882
LLT LeftoverTy;
5969
5883
if (!extractParts (MI.getOperand (2 ).getReg (), DstTy, NarrowTy, LeftoverTy,
5970
- Src1Regs, Src1LeftoverRegs))
5884
+ Src1Regs, Src1LeftoverRegs, MIRBuilder, MRI ))
5971
5885
return UnableToLegalize;
5972
5886
5973
5887
LLT Unused;
5974
5888
if (!extractParts (MI.getOperand (3 ).getReg (), DstTy, NarrowTy, Unused,
5975
- Src2Regs, Src2LeftoverRegs))
5889
+ Src2Regs, Src2LeftoverRegs, MIRBuilder, MRI ))
5976
5890
llvm_unreachable (" inconsistent extractParts result" );
5977
5891
5978
5892
for (unsigned I = 0 , E = Src1Regs.size (); I != E; ++I) {
@@ -6468,7 +6382,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerTRUNC(MachineInstr &MI) {
6468
6382
6469
6383
// First, split the source into two smaller vectors.
6470
6384
SmallVector<Register, 2 > SplitSrcs;
6471
- extractParts (SrcReg, SplitSrcTy, 2 , SplitSrcs);
6385
+ extractParts (SrcReg, SplitSrcTy, 2 , SplitSrcs, MIRBuilder, MRI );
6472
6386
6473
6387
// Truncate the splits into intermediate narrower elements.
6474
6388
LLT InterTy;
@@ -7208,7 +7122,7 @@ LegalizerHelper::lowerExtractInsertVectorElt(MachineInstr &MI) {
7208
7122
int64_t IdxVal;
7209
7123
if (mi_match (Idx, MRI, m_ICst (IdxVal)) && IdxVal <= NumElts) {
7210
7124
SmallVector<Register, 8 > SrcRegs;
7211
- extractParts (SrcVec, EltTy, NumElts, SrcRegs);
7125
+ extractParts (SrcVec, EltTy, NumElts, SrcRegs, MIRBuilder, MRI );
7212
7126
7213
7127
if (InsertVal) {
7214
7128
SrcRegs[IdxVal] = MI.getOperand (2 ).getReg ();
0 commit comments