@@ -184,22 +184,21 @@ struct OutgoingValueHandler : public CallLowering::ValueHandler {
184
184
185
185
} // end anonymous namespace
186
186
187
- void ARMCallLowering::splitToValueTypes (
188
- const ArgInfo &OrigArg, SmallVectorImpl<ArgInfo> &SplitArgs,
189
- MachineFunction &MF, const SplitArgTy &PerformArgSplit ) const {
187
+ void ARMCallLowering::splitToValueTypes (const ArgInfo &OrigArg,
188
+ SmallVectorImpl<ArgInfo> &SplitArgs,
189
+ MachineFunction &MF ) const {
190
190
const ARMTargetLowering &TLI = *getTLI<ARMTargetLowering>();
191
191
LLVMContext &Ctx = OrigArg.Ty ->getContext ();
192
192
const DataLayout &DL = MF.getDataLayout ();
193
- MachineRegisterInfo &MRI = MF.getRegInfo ();
194
193
const Function &F = MF.getFunction ();
195
194
196
195
SmallVector<EVT, 4 > SplitVTs;
197
196
ComputeValueVTs (TLI, DL, OrigArg.Ty , SplitVTs, nullptr , nullptr , 0 );
197
+ assert (OrigArg.Regs .size () == SplitVTs.size () && " Regs / types mismatch" );
198
198
199
199
if (SplitVTs.size () == 1 ) {
200
200
// Even if there is no splitting to do, we still want to replace the
201
201
// original type (e.g. pointer type -> integer).
202
- assert (OrigArg.Regs .size () == 1 && " Regs / types mismatch" );
203
202
auto Flags = OrigArg.Flags ;
204
203
unsigned OriginalAlignment = DL.getABITypeAlignment (OrigArg.Ty );
205
204
Flags.setOrigAlign (OriginalAlignment);
@@ -208,34 +207,7 @@ void ARMCallLowering::splitToValueTypes(
208
207
return ;
209
208
}
210
209
211
- if (OrigArg.Regs .size () > 1 ) {
212
- // Create one ArgInfo for each virtual register.
213
- assert (OrigArg.Regs .size () == SplitVTs.size () && " Regs / types mismatch" );
214
- for (unsigned i = 0 , e = SplitVTs.size (); i != e; ++i) {
215
- EVT SplitVT = SplitVTs[i];
216
- Type *SplitTy = SplitVT.getTypeForEVT (Ctx);
217
- auto Flags = OrigArg.Flags ;
218
-
219
- unsigned OriginalAlignment = DL.getABITypeAlignment (SplitTy);
220
- Flags.setOrigAlign (OriginalAlignment);
221
-
222
- bool NeedsConsecutiveRegisters =
223
- TLI.functionArgumentNeedsConsecutiveRegisters (
224
- SplitTy, F.getCallingConv (), F.isVarArg ());
225
- if (NeedsConsecutiveRegisters) {
226
- Flags.setInConsecutiveRegs ();
227
- if (i == e - 1 )
228
- Flags.setInConsecutiveRegsLast ();
229
- }
230
-
231
- // FIXME: We also want to split SplitTy further.
232
- Register PartReg = OrigArg.Regs [i];
233
- SplitArgs.emplace_back (PartReg, SplitTy, Flags, OrigArg.IsFixed );
234
- }
235
-
236
- return ;
237
- }
238
-
210
+ // Create one ArgInfo for each virtual register.
239
211
for (unsigned i = 0 , e = SplitVTs.size (); i != e; ++i) {
240
212
EVT SplitVT = SplitVTs[i];
241
213
Type *SplitTy = SplitVT.getTypeForEVT (Ctx);
@@ -253,10 +225,9 @@ void ARMCallLowering::splitToValueTypes(
253
225
Flags.setInConsecutiveRegsLast ();
254
226
}
255
227
256
- Register PartReg =
257
- MRI.createGenericVirtualRegister (getLLTForType (*SplitTy, DL));
258
- SplitArgs.push_back (ArgInfo{PartReg, SplitTy, Flags, OrigArg.IsFixed });
259
- PerformArgSplit (PartReg);
228
+ // FIXME: We also want to split SplitTy further.
229
+ Register PartReg = OrigArg.Regs [i];
230
+ SplitArgs.emplace_back (PartReg, SplitTy, Flags, OrigArg.IsFixed );
260
231
}
261
232
}
262
233
@@ -277,29 +248,17 @@ bool ARMCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder,
277
248
if (!isSupportedType (DL, TLI, Val->getType ()))
278
249
return false ;
279
250
280
- SmallVector<EVT, 4 > SplitEVTs;
281
- ComputeValueVTs (TLI, DL, Val->getType (), SplitEVTs);
282
- assert (VRegs.size () == SplitEVTs.size () &&
283
- " For each split Type there should be exactly one VReg." );
284
-
285
- SmallVector<ArgInfo, 4 > SplitVTs;
286
- LLVMContext &Ctx = Val->getType ()->getContext ();
287
- for (unsigned i = 0 ; i < SplitEVTs.size (); ++i) {
288
- ArgInfo CurArgInfo (VRegs[i], SplitEVTs[i].getTypeForEVT (Ctx));
289
- setArgFlags (CurArgInfo, AttributeList::ReturnIndex, DL, F);
290
-
291
- SmallVector<Register, 4 > Regs;
292
- splitToValueTypes (CurArgInfo, SplitVTs, MF,
293
- [&](Register Reg) { Regs.push_back (Reg); });
294
- if (Regs.size () > 1 )
295
- MIRBuilder.buildUnmerge (Regs, VRegs[i]);
296
- }
251
+ ArgInfo OrigRetInfo (VRegs, Val->getType ());
252
+ setArgFlags (OrigRetInfo, AttributeList::ReturnIndex, DL, F);
253
+
254
+ SmallVector<ArgInfo, 4 > SplitRetInfos;
255
+ splitToValueTypes (OrigRetInfo, SplitRetInfos, MF);
297
256
298
257
CCAssignFn *AssignFn =
299
258
TLI.CCAssignFnForReturn (F.getCallingConv (), F.isVarArg ());
300
259
301
260
OutgoingValueHandler RetHandler (MIRBuilder, MF.getRegInfo (), Ret, AssignFn);
302
- return handleAssignments (MIRBuilder, SplitVTs , RetHandler);
261
+ return handleAssignments (MIRBuilder, SplitRetInfos , RetHandler);
303
262
}
304
263
305
264
bool ARMCallLowering::lowerReturn (MachineIRBuilder &MIRBuilder,
@@ -489,11 +448,9 @@ bool ARMCallLowering::lowerFormalArguments(
489
448
unsigned Idx = 0 ;
490
449
for (auto &Arg : F.args ()) {
491
450
ArgInfo OrigArgInfo (VRegs[Idx], Arg.getType ());
492
- setArgFlags (OrigArgInfo, Idx + AttributeList::FirstArgIndex, DL, F);
493
451
494
- splitToValueTypes (OrigArgInfo, SplitArgInfos, MF, [&](Register Reg) {
495
- llvm_unreachable (" Args should already be split" );
496
- });
452
+ setArgFlags (OrigArgInfo, Idx + AttributeList::FirstArgIndex, DL, F);
453
+ splitToValueTypes (OrigArgInfo, SplitArgInfos, MF);
497
454
498
455
Idx++;
499
456
}
@@ -596,9 +553,7 @@ bool ARMCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
596
553
if (Arg.Flags .isByVal ())
597
554
return false ;
598
555
599
- splitToValueTypes (Arg, ArgInfos, MF, [&](Register Reg) {
600
- llvm_unreachable (" Function args should already be split" );
601
- });
556
+ splitToValueTypes (Arg, ArgInfos, MF);
602
557
}
603
558
604
559
auto ArgAssignFn = TLI.CCAssignFnForCall (CallConv, IsVarArg);
@@ -614,10 +569,7 @@ bool ARMCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
614
569
return false ;
615
570
616
571
ArgInfos.clear ();
617
- splitToValueTypes (OrigRet, ArgInfos, MF, [&](Register Reg) {
618
- llvm_unreachable (" Call results should already be split" );
619
- });
620
-
572
+ splitToValueTypes (OrigRet, ArgInfos, MF);
621
573
auto RetAssignFn = TLI.CCAssignFnForReturn (CallConv, IsVarArg);
622
574
CallReturnHandler RetHandler (MIRBuilder, MRI, MIB, RetAssignFn);
623
575
if (!handleAssignments (MIRBuilder, ArgInfos, RetHandler))
0 commit comments