Skip to content

Commit b6b46f5

Browse files
committed
[AArch64][GlobalISel] Support returned argument with multiple registers
The call lowering code assumed that a returned argument could only consist of one register. Pass an ArrayRef<Register> instead of Register to make sure that all parts get assigned. Fixes llvm#53315. Differential Revision: https://reviews.llvm.org/D117866
1 parent 221a195 commit b6b46f5

File tree

4 files changed

+39
-13
lines changed

4 files changed

+39
-13
lines changed

llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -382,12 +382,12 @@ class CallLowering {
382382
/// \p Handler to move them to the assigned locations.
383383
///
384384
/// \return True if everything has succeeded, false otherwise.
385-
bool determineAndHandleAssignments(ValueHandler &Handler,
386-
ValueAssigner &Assigner,
387-
SmallVectorImpl<ArgInfo> &Args,
388-
MachineIRBuilder &MIRBuilder,
389-
CallingConv::ID CallConv, bool IsVarArg,
390-
Register ThisReturnReg = Register()) const;
385+
bool
386+
determineAndHandleAssignments(ValueHandler &Handler, ValueAssigner &Assigner,
387+
SmallVectorImpl<ArgInfo> &Args,
388+
MachineIRBuilder &MIRBuilder,
389+
CallingConv::ID CallConv, bool IsVarArg,
390+
ArrayRef<Register> ThisReturnRegs = None) const;
391391

392392
/// Use \p Handler to insert code to handle the argument/return values
393393
/// represented by \p Args. It's expected determineAssignments previously
@@ -396,7 +396,7 @@ class CallLowering {
396396
CCState &CCState,
397397
SmallVectorImpl<CCValAssign> &ArgLocs,
398398
MachineIRBuilder &MIRBuilder,
399-
Register ThisReturnReg = Register()) const;
399+
ArrayRef<Register> ThisReturnRegs = None) const;
400400

401401
/// Check whether parameters to a call that are passed in callee saved
402402
/// registers are the same as from the calling function. This needs to be

llvm/lib/CodeGen/GlobalISel/CallLowering.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,8 @@ static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef<Register> DstRegs,
518518
bool CallLowering::determineAndHandleAssignments(
519519
ValueHandler &Handler, ValueAssigner &Assigner,
520520
SmallVectorImpl<ArgInfo> &Args, MachineIRBuilder &MIRBuilder,
521-
CallingConv::ID CallConv, bool IsVarArg, Register ThisReturnReg) const {
521+
CallingConv::ID CallConv, bool IsVarArg,
522+
ArrayRef<Register> ThisReturnRegs) const {
522523
MachineFunction &MF = MIRBuilder.getMF();
523524
const Function &F = MF.getFunction();
524525
SmallVector<CCValAssign, 16> ArgLocs;
@@ -528,7 +529,7 @@ bool CallLowering::determineAndHandleAssignments(
528529
return false;
529530

530531
return handleAssignments(Handler, Args, CCInfo, ArgLocs, MIRBuilder,
531-
ThisReturnReg);
532+
ThisReturnRegs);
532533
}
533534

534535
static unsigned extendOpFromFlags(llvm::ISD::ArgFlagsTy Flags) {
@@ -605,7 +606,7 @@ bool CallLowering::handleAssignments(ValueHandler &Handler,
605606
CCState &CCInfo,
606607
SmallVectorImpl<CCValAssign> &ArgLocs,
607608
MachineIRBuilder &MIRBuilder,
608-
Register ThisReturnReg) const {
609+
ArrayRef<Register> ThisReturnRegs) const {
609610
MachineFunction &MF = MIRBuilder.getMF();
610611
MachineRegisterInfo &MRI = MF.getRegInfo();
611612
const Function &F = MF.getFunction();
@@ -732,10 +733,10 @@ bool CallLowering::handleAssignments(ValueHandler &Handler,
732733

733734
assert(!VA.needsCustom() && "custom loc should have been handled already");
734735

735-
if (i == 0 && ThisReturnReg.isValid() &&
736+
if (i == 0 && !ThisReturnRegs.empty() &&
736737
Handler.isIncomingArgumentHandler() &&
737738
isTypeIsValidForThisReturn(ValVT)) {
738-
Handler.assignValueToReg(Args[i].Regs[i], ThisReturnReg, VA);
739+
Handler.assignValueToReg(ArgReg, ThisReturnRegs[Part], VA);
739740
continue;
740741
}
741742

llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1130,7 +1130,7 @@ bool AArch64CallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
11301130
if (!determineAndHandleAssignments(
11311131
UsingReturnedArg ? ReturnedArgHandler : Handler, Assigner, InArgs,
11321132
MIRBuilder, Info.CallConv, Info.IsVarArg,
1133-
UsingReturnedArg ? OutArgs[0].Regs[0] : Register()))
1133+
UsingReturnedArg ? makeArrayRef(OutArgs[0].Regs) : None))
11341134
return false;
11351135
}
11361136

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -O0 -mtriple=aarch64-unknown-linux-gnu -verify-machineinstrs < %s | FileCheck %s
3+
4+
define void @test() nounwind {
5+
; CHECK-LABEL: test:
6+
; CHECK: // %bb.0:
7+
; CHECK-NEXT: sub sp, sp, #32
8+
; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
9+
; CHECK-NEXT: mov x1, xzr
10+
; CHECK-NEXT: str x1, [sp, #8] // 8-byte Folded Spill
11+
; CHECK-NEXT: mov x0, x1
12+
; CHECK-NEXT: bl returns_arg
13+
; CHECK-NEXT: ldr x1, [sp, #8] // 8-byte Folded Reload
14+
; CHECK-NEXT: mov x0, x1
15+
; CHECK-NEXT: bl accepts_arg
16+
; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
17+
; CHECK-NEXT: add sp, sp, #32
18+
; CHECK-NEXT: ret
19+
%x = call i128 @returns_arg(i128 0)
20+
call void @accepts_arg(i128 %x)
21+
ret void
22+
}
23+
24+
declare i128 @returns_arg(i128 returned)
25+
declare void @accepts_arg(i128)

0 commit comments

Comments
 (0)