Skip to content

Commit 818f502

Browse files
committed
[AArch64][GlobalISel] Pre-Commit for Combine ADDLV(ADDLP)
1 parent 966416b commit 818f502

File tree

12 files changed

+3432
-4416
lines changed

12 files changed

+3432
-4416
lines changed

llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -187,22 +187,6 @@ class LegalizerHelper {
187187
LegalizeResult widenScalarMulo(MachineInstr &MI, unsigned TypeIdx,
188188
LLT WideTy);
189189

190-
/// Helper function to split a wide generic register into bitwise blocks with
191-
/// the given Type (which implies the number of blocks needed). The generic
192-
/// registers created are appended to Ops, starting at bit 0 of Reg.
193-
void extractParts(Register Reg, LLT Ty, int NumParts,
194-
SmallVectorImpl<Register> &VRegs);
195-
196-
/// Version which handles irregular splits.
197-
bool extractParts(Register Reg, LLT RegTy, LLT MainTy,
198-
LLT &LeftoverTy,
199-
SmallVectorImpl<Register> &VRegs,
200-
SmallVectorImpl<Register> &LeftoverVRegs);
201-
202-
/// Version which handles irregular sub-vector splits.
203-
void extractVectorParts(Register Reg, unsigned NumElst,
204-
SmallVectorImpl<Register> &VRegs);
205-
206190
/// Helper function to build a wide generic register \p DstReg of type \p
207191
/// RegTy from smaller parts. This will produce a G_MERGE_VALUES,
208192
/// G_BUILD_VECTOR, G_CONCAT_VECTORS, or sequence of G_INSERT as appropriate

llvm/include/llvm/CodeGen/GlobalISel/Utils.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class BlockFrequencyInfo;
3333
class GISelKnownBits;
3434
class MachineFunction;
3535
class MachineInstr;
36+
class MachineIRBuilder;
3637
class MachineOperand;
3738
class MachineOptimizationRemarkEmitter;
3839
class MachineOptimizationRemarkMissed;
@@ -247,6 +248,24 @@ MachineInstr *getDefIgnoringCopies(Register Reg,
247248
/// Also walks through hints such as G_ASSERT_ZEXT.
248249
Register getSrcRegIgnoringCopies(Register Reg, const MachineRegisterInfo &MRI);
249250

251+
/// Helper function to split a wide generic register into bitwise blocks with
252+
/// the given Type (which implies the number of blocks needed). The generic
253+
/// registers created are appended to Ops, starting at bit 0 of Reg.
254+
void extractParts(Register Reg, LLT Ty, int NumParts,
255+
SmallVectorImpl<Register> &VRegs,
256+
MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI);
257+
258+
/// Version which handles irregular splits.
259+
bool extractParts(Register Reg, LLT RegTy, LLT MainTy, LLT &LeftoverTy,
260+
SmallVectorImpl<Register> &VRegs,
261+
SmallVectorImpl<Register> &LeftoverVRegs,
262+
MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI);
263+
264+
/// Version which handles irregular sub-vector splits.
265+
void extractVectorParts(Register Reg, unsigned NumElst,
266+
SmallVectorImpl<Register> &VRegs,
267+
MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI);
268+
250269
// Templated variant of getOpcodeDef returning a MachineInstr derived T.
251270
/// See if Reg is defined by an single def instruction of type T
252271
/// Also try to do trivial folding if it's a COPY with

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 32 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -156,100 +156,6 @@ LegalizerHelper::legalizeInstrStep(MachineInstr &MI,
156156
}
157157
}
158158

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-
253159
void LegalizerHelper::insertParts(Register DstReg,
254160
LLT ResultTy, LLT PartTy,
255161
ArrayRef<Register> PartRegs,
@@ -291,7 +197,8 @@ void LegalizerHelper::appendVectorElts(SmallVectorImpl<Register> &Elts,
291197
Register Reg) {
292198
LLT Ty = MRI.getType(Reg);
293199
SmallVector<Register, 8> RegElts;
294-
extractParts(Reg, Ty.getScalarType(), Ty.getNumElements(), RegElts);
200+
extractParts(Reg, Ty.getScalarType(), Ty.getNumElements(), RegElts,
201+
MIRBuilder, MRI);
295202
Elts.append(RegElts);
296203
}
297204

@@ -1330,7 +1237,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
13301237
MachineBasicBlock &OpMBB = *MI.getOperand(i + 1).getMBB();
13311238
MIRBuilder.setInsertPt(OpMBB, OpMBB.getFirstTerminatorForward());
13321239
extractParts(MI.getOperand(i).getReg(), NarrowTy, NumParts,
1333-
SrcRegs[i / 2]);
1240+
SrcRegs[i / 2], MIRBuilder, MRI);
13341241
}
13351242
MachineBasicBlock &MBB = *MI.getParent();
13361243
MIRBuilder.setInsertPt(MBB, MI);
@@ -1372,13 +1279,13 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
13721279
LLT LeftoverTy; // Example: s88 -> s64 (NarrowTy) + s24 (leftover)
13731280
SmallVector<Register, 4> LHSPartRegs, LHSLeftoverRegs;
13741281
if (!extractParts(LHS, SrcTy, NarrowTy, LeftoverTy, LHSPartRegs,
1375-
LHSLeftoverRegs))
1282+
LHSLeftoverRegs, MIRBuilder, MRI))
13761283
return UnableToLegalize;
13771284

13781285
LLT Unused; // Matches LeftoverTy; G_ICMP LHS and RHS are the same type.
13791286
SmallVector<Register, 4> RHSPartRegs, RHSLeftoverRegs;
13801287
if (!extractParts(MI.getOperand(3).getReg(), SrcTy, NarrowTy, Unused,
1381-
RHSPartRegs, RHSLeftoverRegs))
1288+
RHSPartRegs, RHSLeftoverRegs, MIRBuilder, MRI))
13821289
return UnableToLegalize;
13831290

13841291
// We now have the LHS and RHS of the compare split into narrow-type
@@ -1532,7 +1439,8 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
15321439
Observer.changingInstr(MI);
15331440
SmallVector<Register, 2> SrcRegs, DstRegs;
15341441
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);
15361444

15371445
for (unsigned i = 0; i < NumParts; ++i) {
15381446
auto DstPart = MIRBuilder.buildInstr(MI.getOpcode(), {NarrowTy},
@@ -3981,7 +3889,8 @@ LegalizerHelper::fewerElementsVectorMultiEltType(
39813889
MI.getOperand(UseIdx));
39823890
} else {
39833891
SmallVector<Register, 8> SplitPieces;
3984-
extractVectorParts(MI.getReg(UseIdx), NumElts, SplitPieces);
3892+
extractVectorParts(MI.getReg(UseIdx), NumElts, SplitPieces, MIRBuilder,
3893+
MRI);
39853894
for (auto Reg : SplitPieces)
39863895
InputOpsPieces[UseNo].push_back(Reg);
39873896
}
@@ -4037,7 +3946,8 @@ LegalizerHelper::fewerElementsVectorPhi(GenericMachineInstr &MI,
40373946
UseIdx += 2, ++UseNo) {
40383947
MachineBasicBlock &OpMBB = *MI.getOperand(UseIdx + 1).getMBB();
40393948
MIRBuilder.setInsertPt(OpMBB, OpMBB.getFirstTerminatorForward());
4040-
extractVectorParts(MI.getReg(UseIdx), NumElts, InputOpsPieces[UseNo]);
3949+
extractVectorParts(MI.getReg(UseIdx), NumElts, InputOpsPieces[UseNo],
3950+
MIRBuilder, MRI);
40413951
}
40423952

40433953
// Build PHIs with fewer elements.
@@ -4306,7 +4216,7 @@ LegalizerHelper::reduceLoadStoreWidth(GLoadStore &LdStMI, unsigned TypeIdx,
43064216
std::tie(NumParts, NumLeftover) = getNarrowTypeBreakDown(ValTy, NarrowTy, LeftoverTy);
43074217
} else {
43084218
if (extractParts(ValReg, ValTy, NarrowTy, LeftoverTy, NarrowRegs,
4309-
NarrowLeftoverRegs)) {
4219+
NarrowLeftoverRegs, MIRBuilder, MRI)) {
43104220
NumParts = NarrowRegs.size();
43114221
NumLeftover = NarrowLeftoverRegs.size();
43124222
}
@@ -4547,8 +4457,8 @@ LegalizerHelper::LegalizeResult LegalizerHelper::fewerElementsVectorShuffle(
45474457
unsigned NewElts = NarrowTy.getNumElements();
45484458

45494459
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);
45524462
Register Inputs[4] = {SplitSrc1Regs[0], SplitSrc1Regs[1], SplitSrc2Regs[0],
45534463
SplitSrc2Regs[1]};
45544464

@@ -4682,7 +4592,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::fewerElementsVectorReductions(
46824592
NarrowTy.isVector() ? SrcTy.getNumElements() / NarrowTy.getNumElements()
46834593
: SrcTy.getNumElements();
46844594

4685-
extractParts(SrcReg, NarrowTy, NumParts, SplitSrcs);
4595+
extractParts(SrcReg, NarrowTy, NumParts, SplitSrcs, MIRBuilder, MRI);
46864596
if (NarrowTy.isScalar()) {
46874597
if (DstTy != NarrowTy)
46884598
return UnableToLegalize; // FIXME: handle implicit extensions.
@@ -4753,7 +4663,8 @@ LegalizerHelper::tryNarrowPow2Reduction(MachineInstr &MI, Register SrcReg,
47534663
SmallVector<Register> SplitSrcs;
47544664
// Split the sources into NarrowTy size pieces.
47554665
extractParts(SrcReg, NarrowTy,
4756-
SrcTy.getNumElements() / NarrowTy.getNumElements(), SplitSrcs);
4666+
SrcTy.getNumElements() / NarrowTy.getNumElements(), SplitSrcs,
4667+
MIRBuilder, MRI);
47574668
// We're going to do a tree reduction using vector operations until we have
47584669
// one NarrowTy size value left.
47594670
while (SplitSrcs.size() > 1) {
@@ -5392,8 +5303,10 @@ LegalizerHelper::narrowScalarAddSub(MachineInstr &MI, unsigned TypeIdx,
53925303
LLT RegTy = MRI.getType(MI.getOperand(0).getReg());
53935304
LLT LeftoverTy, DummyTy;
53945305
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);
53975310

53985311
int NarrowParts = Src1Regs.size();
53995312
for (int I = 0, E = Src1Left.size(); I != E; ++I) {
@@ -5451,8 +5364,8 @@ LegalizerHelper::narrowScalarMul(MachineInstr &MI, LLT NarrowTy) {
54515364

54525365
SmallVector<Register, 2> Src1Parts, Src2Parts;
54535366
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);
54565369
multiplyRegisters(DstTmpRegs, Src1Parts, Src2Parts, NarrowTy);
54575370

54585371
// Take only high half of registers if this is high mul.
@@ -5504,7 +5417,8 @@ LegalizerHelper::narrowScalarExtract(MachineInstr &MI, unsigned TypeIdx,
55045417

55055418
SmallVector<Register, 2> SrcRegs, DstRegs;
55065419
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);
55085422

55095423
Register OpReg = MI.getOperand(0).getReg();
55105424
uint64_t OpStart = MI.getOperand(2).getImm();
@@ -5566,7 +5480,7 @@ LegalizerHelper::narrowScalarInsert(MachineInstr &MI, unsigned TypeIdx,
55665480
LLT RegTy = MRI.getType(MI.getOperand(0).getReg());
55675481
LLT LeftoverTy;
55685482
extractParts(MI.getOperand(1).getReg(), RegTy, NarrowTy, LeftoverTy, SrcRegs,
5569-
LeftoverRegs);
5483+
LeftoverRegs, MIRBuilder, MRI);
55705484

55715485
for (Register Reg : LeftoverRegs)
55725486
SrcRegs.push_back(Reg);
@@ -5651,12 +5565,12 @@ LegalizerHelper::narrowScalarBasic(MachineInstr &MI, unsigned TypeIdx,
56515565
SmallVector<Register, 4> Src1Regs, Src1LeftoverRegs;
56525566
LLT LeftoverTy;
56535567
if (!extractParts(MI.getOperand(1).getReg(), DstTy, NarrowTy, LeftoverTy,
5654-
Src0Regs, Src0LeftoverRegs))
5568+
Src0Regs, Src0LeftoverRegs, MIRBuilder, MRI))
56555569
return UnableToLegalize;
56565570

56575571
LLT Unused;
56585572
if (!extractParts(MI.getOperand(2).getReg(), DstTy, NarrowTy, Unused,
5659-
Src1Regs, Src1LeftoverRegs))
5573+
Src1Regs, Src1LeftoverRegs, MIRBuilder, MRI))
56605574
llvm_unreachable("inconsistent extractParts result");
56615575

56625576
for (unsigned I = 0, E = Src1Regs.size(); I != E; ++I) {
@@ -5719,12 +5633,12 @@ LegalizerHelper::narrowScalarSelect(MachineInstr &MI, unsigned TypeIdx,
57195633
SmallVector<Register, 4> Src2Regs, Src2LeftoverRegs;
57205634
LLT LeftoverTy;
57215635
if (!extractParts(MI.getOperand(2).getReg(), DstTy, NarrowTy, LeftoverTy,
5722-
Src1Regs, Src1LeftoverRegs))
5636+
Src1Regs, Src1LeftoverRegs, MIRBuilder, MRI))
57235637
return UnableToLegalize;
57245638

57255639
LLT Unused;
57265640
if (!extractParts(MI.getOperand(3).getReg(), DstTy, NarrowTy, Unused,
5727-
Src2Regs, Src2LeftoverRegs))
5641+
Src2Regs, Src2LeftoverRegs, MIRBuilder, MRI))
57285642
llvm_unreachable("inconsistent extractParts result");
57295643

57305644
for (unsigned I = 0, E = Src1Regs.size(); I != E; ++I) {
@@ -6220,7 +6134,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerTRUNC(MachineInstr &MI) {
62206134

62216135
// First, split the source into two smaller vectors.
62226136
SmallVector<Register, 2> SplitSrcs;
6223-
extractParts(SrcReg, SplitSrcTy, 2, SplitSrcs);
6137+
extractParts(SrcReg, SplitSrcTy, 2, SplitSrcs, MIRBuilder, MRI);
62246138

62256139
// Truncate the splits into intermediate narrower elements.
62266140
LLT InterTy;
@@ -6960,7 +6874,7 @@ LegalizerHelper::lowerExtractInsertVectorElt(MachineInstr &MI) {
69606874
int64_t IdxVal;
69616875
if (mi_match(Idx, MRI, m_ICst(IdxVal)) && IdxVal <= NumElts) {
69626876
SmallVector<Register, 8> SrcRegs;
6963-
extractParts(SrcVec, EltTy, NumElts, SrcRegs);
6877+
extractParts(SrcVec, EltTy, NumElts, SrcRegs, MIRBuilder, MRI);
69646878

69656879
if (InsertVal) {
69666880
SrcRegs[IdxVal] = MI.getOperand(2).getReg();

0 commit comments

Comments
 (0)