@@ -143,7 +143,7 @@ LegalizerHelper::legalizeInstrStep(MachineInstr &MI,
143
143
return moreElementsVector (MI, Step.TypeIdx , Step.NewType );
144
144
case Custom:
145
145
LLVM_DEBUG (dbgs () << " .. Custom legalization\n " );
146
- return LI.legalizeCustomMaybeLegal (*this , MI);
146
+ return LI.legalizeCustomMaybeLegal (*this , MI, LocObserver );
147
147
default :
148
148
LLVM_DEBUG (dbgs () << " .. Unable to legalize\n " );
149
149
return UnableToLegalize;
@@ -162,6 +162,52 @@ void LegalizerHelper::extractParts(Register Reg, LLT Ty, int NumParts,
162
162
MIRBuilder.buildUnmerge (VRegs, Reg);
163
163
}
164
164
165
+ bool LegalizerHelper::extractParts (Register Reg, LLT RegTy,
166
+ LLT MainTy, LLT &LeftoverTy,
167
+ SmallVectorImpl<Register> &VRegs,
168
+ SmallVectorImpl<Register> &LeftoverRegs) {
169
+ assert (!LeftoverTy.isValid () && " this is an out argument" );
170
+
171
+ unsigned RegSize = RegTy.getSizeInBits ();
172
+ unsigned MainSize = MainTy.getSizeInBits ();
173
+ unsigned NumParts = RegSize / MainSize;
174
+ unsigned LeftoverSize = RegSize - NumParts * MainSize;
175
+
176
+ // Use an unmerge when possible.
177
+ if (LeftoverSize == 0 ) {
178
+ for (unsigned I = 0 ; I < NumParts; ++I)
179
+ VRegs.push_back (MRI.createGenericVirtualRegister (MainTy));
180
+ MIRBuilder.buildUnmerge (VRegs, Reg);
181
+ return true ;
182
+ }
183
+
184
+ if (MainTy.isVector ()) {
185
+ unsigned EltSize = MainTy.getScalarSizeInBits ();
186
+ if (LeftoverSize % EltSize != 0 )
187
+ return false ;
188
+ LeftoverTy = LLT::scalarOrVector (
189
+ ElementCount::getFixed (LeftoverSize / EltSize), EltSize);
190
+ } else {
191
+ LeftoverTy = LLT::scalar (LeftoverSize);
192
+ }
193
+
194
+ // For irregular sizes, extract the individual parts.
195
+ for (unsigned I = 0 ; I != NumParts; ++I) {
196
+ Register NewReg = MRI.createGenericVirtualRegister (MainTy);
197
+ VRegs.push_back (NewReg);
198
+ MIRBuilder.buildExtract (NewReg, Reg, MainSize * I);
199
+ }
200
+
201
+ for (unsigned Offset = MainSize * NumParts; Offset < RegSize;
202
+ Offset += LeftoverSize) {
203
+ Register NewReg = MRI.createGenericVirtualRegister (LeftoverTy);
204
+ LeftoverRegs.push_back (NewReg);
205
+ MIRBuilder.buildExtract (NewReg, Reg, Offset);
206
+ }
207
+
208
+ return true ;
209
+ }
210
+
165
211
bool LegalizerHelper::extractParts (Register Reg, LLT RegTy, LLT MainTy,
166
212
SmallVectorImpl<Register> &VRegs,
167
213
LLT &LeftoverTy, Register &LeftoverReg) {
@@ -795,8 +841,8 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
795
841
unsigned OpSize = MRI.getType (MI.getOperand (1 ).getReg ()).getSizeInBits ();
796
842
Type *OpTy = IntegerType::get (Ctx, OpSize);
797
843
RTLIB::Libcall Libcall = getRTLibDesc (MI.getOpcode (), OpSize);
798
- createLibcall (MIRBuilder, Libcall, {MI.getOperand (0 ).getReg (), ResTy},
799
- {{MI.getOperand (1 ).getReg (), OpTy}});
844
+ createLibcall (MIRBuilder, Libcall, {MI.getOperand (0 ).getReg (), ResTy, 0 },
845
+ {{MI.getOperand (1 ).getReg (), OpTy, 0 }});
800
846
break ;
801
847
}
802
848
case TargetOpcode::G_SHL:
@@ -807,8 +853,9 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
807
853
Register AmountReg = MI.getOperand (2 ).getReg ();
808
854
Type *AmountTy =
809
855
IntegerType::get (Ctx, MRI.getType (AmountReg).getSizeInBits ());
810
- createLibcall (MIRBuilder, Libcall, {MI.getOperand (0 ).getReg (), OpTy},
811
- {{MI.getOperand (1 ).getReg (), OpTy}, {AmountReg, AmountTy}});
856
+ createLibcall (
857
+ MIRBuilder, Libcall, {MI.getOperand (0 ).getReg (), OpTy, 0 },
858
+ {{MI.getOperand (1 ).getReg (), OpTy, 0 }, {AmountReg, AmountTy, 0 }});
812
859
break ;
813
860
}
814
861
case TargetOpcode::G_INTRINSIC_TRUNC:
@@ -4238,17 +4285,22 @@ LegalizerHelper::reduceLoadStoreWidth(GLoadStore &LdStMI, unsigned TypeIdx,
4238
4285
return UnableToLegalize;
4239
4286
}
4240
4287
4241
- unsigned NumParts = 0 ;
4288
+ int NumParts = -1 ;
4289
+ int NumLeftover = -1 ;
4242
4290
LLT LeftoverTy;
4243
- SmallVector<Register, 8 > NarrowRegs;
4244
- Register NarrowLeftoverReg;
4291
+ SmallVector<Register, 8 > NarrowRegs, NarrowLeftoverRegs;
4245
4292
if (IsLoad) {
4246
4293
NumParts = getNarrowTypeBreakDown (ValTy, NarrowTy, LeftoverTy);
4247
- NarrowRegs.resize (NumParts);
4248
- } else if (extractParts (ValReg, ValTy, NarrowTy, NarrowRegs, LeftoverTy,
4249
- NarrowLeftoverReg))
4250
- NumParts = NarrowRegs.size ();
4251
- if (!NumParts)
4294
+ NumLeftover = LeftoverTy.isValid ();
4295
+ } else {
4296
+ if (extractParts (ValReg, ValTy, NarrowTy, LeftoverTy, NarrowRegs,
4297
+ NarrowLeftoverRegs)) {
4298
+ NumParts = NarrowRegs.size ();
4299
+ NumLeftover = NarrowLeftoverRegs.size ();
4300
+ }
4301
+ }
4302
+
4303
+ if (NumParts == -1 )
4252
4304
return UnableToLegalize;
4253
4305
4254
4306
LLT PtrTy = MRI.getType (AddrReg);
@@ -4272,16 +4324,16 @@ LegalizerHelper::reduceLoadStoreWidth(GLoadStore &LdStMI, unsigned TypeIdx,
4272
4324
4273
4325
MIRBuilder.materializePtrAdd (NewAddrReg, AddrReg, OffsetTy, ByteOffset);
4274
4326
4275
- MachineMemOperand *NewMMO =
4276
- MF.getMachineMemOperand (&MMO, ByteOffset, PartTy);
4327
+ MachineMemOperand *NewMMO =
4328
+ MF.getMachineMemOperand (&MMO, ByteOffset, PartTy);
4277
4329
4278
- if (IsLoad) {
4279
- Register Dst = MRI.createGenericVirtualRegister (PartTy);
4280
- ValRegs[Idx] = Dst;
4281
- MIRBuilder.buildLoad (Dst, NewAddrReg, *NewMMO);
4282
- } else {
4283
- MIRBuilder.buildStore (ValRegs[Idx], NewAddrReg, *NewMMO);
4284
- }
4330
+ if (IsLoad) {
4331
+ Register Dst = MRI.createGenericVirtualRegister (PartTy);
4332
+ ValRegs. push_back ( Dst) ;
4333
+ MIRBuilder.buildLoad (Dst, NewAddrReg, *NewMMO);
4334
+ } else {
4335
+ MIRBuilder.buildStore (ValRegs[Idx], NewAddrReg, *NewMMO);
4336
+ }
4285
4337
}
4286
4338
4287
4339
return Offset;
@@ -4291,11 +4343,12 @@ LegalizerHelper::reduceLoadStoreWidth(GLoadStore &LdStMI, unsigned TypeIdx,
4291
4343
4292
4344
// Handle the rest of the register if this isn't an even type breakdown.
4293
4345
if (LeftoverTy.isValid ())
4294
- splitTypePieces (LeftoverTy, NarrowLeftoverReg , HandledOffset);
4346
+ splitTypePieces (LeftoverTy, NarrowLeftoverRegs , HandledOffset);
4295
4347
4296
- if (IsLoad)
4348
+ if (IsLoad) {
4297
4349
insertParts (ValReg, ValTy, NarrowTy, NarrowRegs, LeftoverTy,
4298
- NarrowLeftoverReg);
4350
+ NarrowLeftoverRegs[0 ]);
4351
+ }
4299
4352
4300
4353
LdStMI.eraseFromParent ();
4301
4354
return Legalized;
@@ -5508,15 +5561,13 @@ LegalizerHelper::narrowScalarInsert(MachineInstr &MI, unsigned TypeIdx,
5508
5561
return UnableToLegalize;
5509
5562
5510
5563
unsigned DstSize = MRI.getType (MI.getOperand (0 ).getReg ()).getSizeInBits ();
5511
- unsigned NarrowSize = NarrowTy.getSizeInBits ();
5564
+ uint64_t NarrowSize = NarrowTy.getSizeInBits ();
5512
5565
5513
5566
// FIXME: add support for when DstSize isn't an exact multiple of
5514
5567
// NarrowSize.
5515
5568
if (DstSize % NarrowSize != 0 )
5516
5569
return UnableToLegalize;
5517
5570
5518
- int NumParts = DstSize / NarrowSize;
5519
-
5520
5571
SmallVector<Register, 2 > SrcRegs, LeftoverRegs, DstRegs;
5521
5572
SmallVector<uint64_t , 2 > Indexes;
5522
5573
LLT RegTy = MRI.getType (MI.getOperand (0 ).getReg ());
@@ -5527,7 +5578,6 @@ LegalizerHelper::narrowScalarInsert(MachineInstr &MI, unsigned TypeIdx,
5527
5578
for (Register Reg : LeftoverRegs)
5528
5579
SrcRegs.push_back (Reg);
5529
5580
5530
- uint64_t NarrowSize = NarrowTy.getSizeInBits ();
5531
5581
Register OpReg = MI.getOperand (2 ).getReg ();
5532
5582
uint64_t OpStart = MI.getOperand (3 ).getImm ();
5533
5583
uint64_t OpSize = MRI.getType (OpReg).getSizeInBits ();
@@ -5556,8 +5606,8 @@ LegalizerHelper::narrowScalarInsert(MachineInstr &MI, unsigned TypeIdx,
5556
5606
5557
5607
// OpSegStart is where this destination segment would start in OpReg if it
5558
5608
// extended infinitely in both directions.
5559
- unsigned ExtractOffset, InsertOffset;
5560
- unsigned SegSize;
5609
+ int64_t ExtractOffset, InsertOffset;
5610
+ uint64_t SegSize;
5561
5611
if (OpStart < DstStart) {
5562
5612
InsertOffset = 0 ;
5563
5613
ExtractOffset = DstStart - OpStart;
0 commit comments