@@ -237,7 +237,7 @@ void ARMCallLowering::splitToValueTypes(
237237// / Lower the return value for the already existing \p Ret. This assumes that
238238// / \p MIRBuilder's insertion point is correct.
239239bool ARMCallLowering::lowerReturnVal (MachineIRBuilder &MIRBuilder,
240- const Value *Val, unsigned VReg ,
240+ const Value *Val, ArrayRef< unsigned > VRegs ,
241241 MachineInstrBuilder &Ret) const {
242242 if (!Val)
243243 // Nothing to do here.
@@ -251,16 +251,24 @@ bool ARMCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder,
251251 if (!isSupportedType (DL, TLI, Val->getType ()))
252252 return false ;
253253
254- SmallVector<ArgInfo, 4 > SplitVTs;
255- SmallVector<unsigned , 4 > Regs;
256- ArgInfo RetInfo (VReg, Val->getType ());
257- setArgFlags (RetInfo, AttributeList::ReturnIndex, DL, F);
258- splitToValueTypes (RetInfo, SplitVTs, MF, [&](unsigned Reg, uint64_t Offset) {
259- Regs.push_back (Reg);
260- });
254+ SmallVector<EVT, 4 > SplitEVTs;
255+ ComputeValueVTs (TLI, DL, Val->getType (), SplitEVTs);
256+ assert (VRegs.size () == SplitEVTs.size () &&
257+ " For each split Type there should be exactly one VReg." );
261258
262- if (Regs.size () > 1 )
263- MIRBuilder.buildUnmerge (Regs, VReg);
259+ SmallVector<ArgInfo, 4 > SplitVTs;
260+ LLVMContext &Ctx = Val->getType ()->getContext ();
261+ for (unsigned i = 0 ; i < SplitEVTs.size (); ++i) {
262+ ArgInfo CurArgInfo (VRegs[i], SplitEVTs[i].getTypeForEVT (Ctx));
263+ setArgFlags (CurArgInfo, AttributeList::ReturnIndex, DL, F);
264+
265+ SmallVector<unsigned , 4 > Regs;
266+ splitToValueTypes (
267+ CurArgInfo, SplitVTs, MF,
268+ [&](unsigned Reg, uint64_t Offset) { Regs.push_back (Reg); });
269+ if (Regs.size () > 1 )
270+ MIRBuilder.buildUnmerge (Regs, VRegs[i]);
271+ }
264272
265273 CCAssignFn *AssignFn =
266274 TLI.CCAssignFnForReturn (F.getCallingConv (), F.isVarArg ());
@@ -270,14 +278,15 @@ bool ARMCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder,
270278}
271279
272280bool ARMCallLowering::lowerReturn (MachineIRBuilder &MIRBuilder,
273- const Value *Val, unsigned VReg) const {
274- assert (!Val == !VReg && " Return value without a vreg" );
281+ const Value *Val,
282+ ArrayRef<unsigned > VRegs) const {
283+ assert (!Val == VRegs.empty () && " Return value without a vreg" );
275284
276285 auto const &ST = MIRBuilder.getMF ().getSubtarget <ARMSubtarget>();
277286 unsigned Opcode = ST.getReturnOpcode ();
278287 auto Ret = MIRBuilder.buildInstrNoInsert (Opcode).add (predOps (ARMCC::AL));
279288
280- if (!lowerReturnVal (MIRBuilder, Val, VReg , Ret))
289+ if (!lowerReturnVal (MIRBuilder, Val, VRegs , Ret))
281290 return false ;
282291
283292 MIRBuilder.insertInstr (Ret);
0 commit comments