Skip to content

Commit 37e403d

Browse files
committed
[ARM GlobalISel] Cleanup CallLowering. NFC
Migrate CallLowering::lowerReturnVal to use the same infrastructure as lowerCall/FormalArguments and remove the now obsolete code path from splitToValueTypes. Forgot to push this earlier. llvm-svn: 366308
1 parent 2be0ebb commit 37e403d

File tree

2 files changed

+20
-71
lines changed

2 files changed

+20
-71
lines changed

llvm/lib/Target/ARM/ARMCallLowering.cpp

Lines changed: 18 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -184,22 +184,21 @@ struct OutgoingValueHandler : public CallLowering::ValueHandler {
184184

185185
} // end anonymous namespace
186186

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 {
190190
const ARMTargetLowering &TLI = *getTLI<ARMTargetLowering>();
191191
LLVMContext &Ctx = OrigArg.Ty->getContext();
192192
const DataLayout &DL = MF.getDataLayout();
193-
MachineRegisterInfo &MRI = MF.getRegInfo();
194193
const Function &F = MF.getFunction();
195194

196195
SmallVector<EVT, 4> SplitVTs;
197196
ComputeValueVTs(TLI, DL, OrigArg.Ty, SplitVTs, nullptr, nullptr, 0);
197+
assert(OrigArg.Regs.size() == SplitVTs.size() && "Regs / types mismatch");
198198

199199
if (SplitVTs.size() == 1) {
200200
// Even if there is no splitting to do, we still want to replace the
201201
// original type (e.g. pointer type -> integer).
202-
assert(OrigArg.Regs.size() == 1 && "Regs / types mismatch");
203202
auto Flags = OrigArg.Flags;
204203
unsigned OriginalAlignment = DL.getABITypeAlignment(OrigArg.Ty);
205204
Flags.setOrigAlign(OriginalAlignment);
@@ -208,34 +207,7 @@ void ARMCallLowering::splitToValueTypes(
208207
return;
209208
}
210209

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.
239211
for (unsigned i = 0, e = SplitVTs.size(); i != e; ++i) {
240212
EVT SplitVT = SplitVTs[i];
241213
Type *SplitTy = SplitVT.getTypeForEVT(Ctx);
@@ -253,10 +225,9 @@ void ARMCallLowering::splitToValueTypes(
253225
Flags.setInConsecutiveRegsLast();
254226
}
255227

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);
260231
}
261232
}
262233

@@ -277,29 +248,17 @@ bool ARMCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder,
277248
if (!isSupportedType(DL, TLI, Val->getType()))
278249
return false;
279250

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);
297256

298257
CCAssignFn *AssignFn =
299258
TLI.CCAssignFnForReturn(F.getCallingConv(), F.isVarArg());
300259

301260
OutgoingValueHandler RetHandler(MIRBuilder, MF.getRegInfo(), Ret, AssignFn);
302-
return handleAssignments(MIRBuilder, SplitVTs, RetHandler);
261+
return handleAssignments(MIRBuilder, SplitRetInfos, RetHandler);
303262
}
304263

305264
bool ARMCallLowering::lowerReturn(MachineIRBuilder &MIRBuilder,
@@ -489,11 +448,9 @@ bool ARMCallLowering::lowerFormalArguments(
489448
unsigned Idx = 0;
490449
for (auto &Arg : F.args()) {
491450
ArgInfo OrigArgInfo(VRegs[Idx], Arg.getType());
492-
setArgFlags(OrigArgInfo, Idx + AttributeList::FirstArgIndex, DL, F);
493451

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);
497454

498455
Idx++;
499456
}
@@ -596,9 +553,7 @@ bool ARMCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
596553
if (Arg.Flags.isByVal())
597554
return false;
598555

599-
splitToValueTypes(Arg, ArgInfos, MF, [&](Register Reg) {
600-
llvm_unreachable("Function args should already be split");
601-
});
556+
splitToValueTypes(Arg, ArgInfos, MF);
602557
}
603558

604559
auto ArgAssignFn = TLI.CCAssignFnForCall(CallConv, IsVarArg);
@@ -614,10 +569,7 @@ bool ARMCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
614569
return false;
615570

616571
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);
621573
auto RetAssignFn = TLI.CCAssignFnForReturn(CallConv, IsVarArg);
622574
CallReturnHandler RetHandler(MIRBuilder, MRI, MIB, RetAssignFn);
623575
if (!handleAssignments(MIRBuilder, ArgInfos, RetHandler))

llvm/lib/Target/ARM/ARMCallLowering.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,11 @@ class ARMCallLowering : public CallLowering {
4747
ArrayRef<Register> VRegs,
4848
MachineInstrBuilder &Ret) const;
4949

50-
using SplitArgTy = std::function<void(unsigned Reg)>;
51-
5250
/// Split an argument into one or more arguments that the CC lowering can cope
53-
/// with (e.g. replace pointers with integers).
51+
/// with.
5452
void splitToValueTypes(const ArgInfo &OrigArg,
5553
SmallVectorImpl<ArgInfo> &SplitArgs,
56-
MachineFunction &MF,
57-
const SplitArgTy &PerformArgSplit) const;
54+
MachineFunction &MF) const;
5855
};
5956

6057
} // end namespace llvm

0 commit comments

Comments
 (0)