Skip to content

Commit 899739c

Browse files
committed
Revert "[AArch64][GlobalISel] Lower formal arguments of AAPCS & ms_abi variadic functions."
This reverts commit 56fd846. This commit regressed handling of functions with floats as arguments, reproducible e.g. like this: $ cat test.c double func(double f) { return f; } $ clang -target aarch64-windows -S -o - test.c -fno-asynchronous-unwind-tables func: sub sp, sp, rust-lang#16 str x0, [sp, rust-lang#8] ldr d0, [sp, rust-lang#8] add sp, sp, rust-lang#16 ret
1 parent de59d22 commit 899739c

File tree

7 files changed

+18
-204
lines changed

7 files changed

+18
-204
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

+8-15
Original file line numberDiff line numberDiff line change
@@ -139,17 +139,6 @@ static cl::opt<unsigned> MaxXors("aarch64-max-xors", cl::init(16), cl::Hidden,
139139
/// Value type used for condition codes.
140140
static const MVT MVT_CC = MVT::i32;
141141

142-
static const MCPhysReg GPRArgRegs[] = {AArch64::X0, AArch64::X1, AArch64::X2,
143-
AArch64::X3, AArch64::X4, AArch64::X5,
144-
AArch64::X6, AArch64::X7};
145-
static const MCPhysReg FPRArgRegs[] = {AArch64::Q0, AArch64::Q1, AArch64::Q2,
146-
AArch64::Q3, AArch64::Q4, AArch64::Q5,
147-
AArch64::Q6, AArch64::Q7};
148-
149-
const ArrayRef<MCPhysReg> llvm::AArch64::getGPRArgRegs() { return GPRArgRegs; }
150-
151-
const ArrayRef<MCPhysReg> llvm::AArch64::getFPRArgRegs() { return FPRArgRegs; }
152-
153142
static inline EVT getPackedSVEVectorVT(EVT VT) {
154143
switch (VT.getSimpleVT().SimpleTy) {
155144
default:
@@ -6573,8 +6562,10 @@ void AArch64TargetLowering::saveVarArgRegisters(CCState &CCInfo,
65736562

65746563
SmallVector<SDValue, 8> MemOps;
65756564

6576-
auto GPRArgRegs = AArch64::getGPRArgRegs();
6577-
unsigned NumGPRArgRegs = GPRArgRegs.size();
6565+
static const MCPhysReg GPRArgRegs[] = { AArch64::X0, AArch64::X1, AArch64::X2,
6566+
AArch64::X3, AArch64::X4, AArch64::X5,
6567+
AArch64::X6, AArch64::X7 };
6568+
unsigned NumGPRArgRegs = std::size(GPRArgRegs);
65786569
if (Subtarget->isWindowsArm64EC()) {
65796570
// In the ARM64EC ABI, only x0-x3 are used to pass arguments to varargs
65806571
// functions.
@@ -6624,8 +6615,10 @@ void AArch64TargetLowering::saveVarArgRegisters(CCState &CCInfo,
66246615
FuncInfo->setVarArgsGPRSize(GPRSaveSize);
66256616

66266617
if (Subtarget->hasFPARMv8() && !IsWin64) {
6627-
auto FPRArgRegs = AArch64::getFPRArgRegs();
6628-
const unsigned NumFPRArgRegs = FPRArgRegs.size();
6618+
static const MCPhysReg FPRArgRegs[] = {
6619+
AArch64::Q0, AArch64::Q1, AArch64::Q2, AArch64::Q3,
6620+
AArch64::Q4, AArch64::Q5, AArch64::Q6, AArch64::Q7};
6621+
static const unsigned NumFPRArgRegs = std::size(FPRArgRegs);
66296622
unsigned FirstVariadicFPR = CCInfo.getFirstUnallocated(FPRArgRegs);
66306623

66316624
unsigned FPRSaveSize = 16 * (NumFPRArgRegs - FirstVariadicFPR);

llvm/lib/Target/AArch64/AArch64ISelLowering.h

-5
Original file line numberDiff line numberDiff line change
@@ -497,11 +497,6 @@ enum Rounding {
497497

498498
// Bit position of rounding mode bits in FPCR.
499499
const unsigned RoundingBitsPos = 22;
500-
501-
// Registers used to pass function arguments.
502-
const ArrayRef<MCPhysReg> getGPRArgRegs();
503-
const ArrayRef<MCPhysReg> getFPRArgRegs();
504-
505500
} // namespace AArch64
506501

507502
class AArch64Subtarget;

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

+9-99
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
#include "AArch64CallLowering.h"
1616
#include "AArch64ISelLowering.h"
1717
#include "AArch64MachineFunctionInfo.h"
18-
#include "AArch64RegisterInfo.h"
1918
#include "AArch64Subtarget.h"
2019
#include "llvm/ADT/ArrayRef.h"
2120
#include "llvm/ADT/SmallVector.h"
@@ -547,98 +546,13 @@ bool AArch64CallLowering::fallBackToDAGISel(const MachineFunction &MF) const {
547546
return false;
548547
}
549548

550-
void AArch64CallLowering::saveVarArgRegisters(
551-
MachineIRBuilder &MIRBuilder, CallLowering::IncomingValueHandler &Handler,
552-
CCState &CCInfo) const {
553-
auto GPRArgRegs = AArch64::getGPRArgRegs();
554-
auto FPRArgRegs = AArch64::getFPRArgRegs();
555-
556-
MachineFunction &MF = MIRBuilder.getMF();
557-
MachineRegisterInfo &MRI = MF.getRegInfo();
558-
MachineFrameInfo &MFI = MF.getFrameInfo();
559-
AArch64FunctionInfo *FuncInfo = MF.getInfo<AArch64FunctionInfo>();
560-
auto &Subtarget = MF.getSubtarget<AArch64Subtarget>();
561-
bool IsWin64CC =
562-
Subtarget.isCallingConvWin64(CCInfo.getCallingConv());
563-
const LLT p0 = LLT::pointer(0, 64);
564-
const LLT s64 = LLT::scalar(64);
565-
566-
unsigned FirstVariadicGPR = CCInfo.getFirstUnallocated(GPRArgRegs);
567-
unsigned NumVariadicGPRArgRegs = GPRArgRegs.size() - FirstVariadicGPR + 1;
568-
569-
unsigned GPRSaveSize = 8 * (GPRArgRegs.size() - FirstVariadicGPR);
570-
int GPRIdx = 0;
571-
if (GPRSaveSize != 0) {
572-
if (IsWin64CC) {
573-
GPRIdx = MFI.CreateFixedObject(GPRSaveSize,
574-
-static_cast<int>(GPRSaveSize), false);
575-
} else
576-
GPRIdx = MFI.CreateStackObject(GPRSaveSize, Align(8), false);
577-
578-
auto FIN = MIRBuilder.buildFrameIndex(p0, GPRIdx);
579-
auto Offset =
580-
MIRBuilder.buildConstant(MRI.createGenericVirtualRegister(s64), 8);
581-
582-
for (unsigned i = FirstVariadicGPR; i < GPRArgRegs.size(); ++i) {
583-
Register Val = MRI.createGenericVirtualRegister(s64);
584-
Handler.assignValueToReg(
585-
Val, GPRArgRegs[i],
586-
CCValAssign::getReg(i + MF.getFunction().getNumOperands(), MVT::i64,
587-
GPRArgRegs[i], MVT::i64, CCValAssign::Full));
588-
auto MPO = IsWin64CC ? MachinePointerInfo::getFixedStack(
589-
MF, GPRIdx, (i - FirstVariadicGPR) * 8)
590-
: MachinePointerInfo::getStack(MF, i * 8);
591-
MIRBuilder.buildStore(Val, FIN, MPO, inferAlignFromPtrInfo(MF, MPO));
592-
593-
FIN = MIRBuilder.buildPtrAdd(MRI.createGenericVirtualRegister(p0),
594-
FIN.getReg(0), Offset);
595-
}
596-
}
597-
FuncInfo->setVarArgsGPRIndex(GPRIdx);
598-
FuncInfo->setVarArgsGPRSize(GPRSaveSize);
599-
600-
if (Subtarget.hasFPARMv8() && !IsWin64CC) {
601-
unsigned FirstVariadicFPR = CCInfo.getFirstUnallocated(FPRArgRegs);
602-
603-
unsigned FPRSaveSize = 16 * (FPRArgRegs.size() - FirstVariadicFPR);
604-
int FPRIdx = 0;
605-
if (FPRSaveSize != 0) {
606-
FPRIdx = MFI.CreateStackObject(FPRSaveSize, Align(16), false);
607-
608-
auto FIN = MIRBuilder.buildFrameIndex(p0, FPRIdx);
609-
auto Offset =
610-
MIRBuilder.buildConstant(MRI.createGenericVirtualRegister(s64), 16);
611-
612-
for (unsigned i = FirstVariadicFPR; i < FPRArgRegs.size(); ++i) {
613-
Register Val = MRI.createGenericVirtualRegister(LLT::scalar(128));
614-
Handler.assignValueToReg(
615-
Val, FPRArgRegs[i],
616-
CCValAssign::getReg(
617-
i + MF.getFunction().getNumOperands() + NumVariadicGPRArgRegs,
618-
MVT::f128, FPRArgRegs[i], MVT::f128, CCValAssign::Full));
619-
620-
auto MPO = MachinePointerInfo::getStack(MF, i * 16);
621-
MIRBuilder.buildStore(Val, FIN, MPO, inferAlignFromPtrInfo(MF, MPO));
622-
623-
FIN = MIRBuilder.buildPtrAdd(MRI.createGenericVirtualRegister(p0),
624-
FIN.getReg(0), Offset);
625-
}
626-
}
627-
FuncInfo->setVarArgsFPRIndex(FPRIdx);
628-
FuncInfo->setVarArgsFPRSize(FPRSaveSize);
629-
}
630-
}
631-
632549
bool AArch64CallLowering::lowerFormalArguments(
633550
MachineIRBuilder &MIRBuilder, const Function &F,
634551
ArrayRef<ArrayRef<Register>> VRegs, FunctionLoweringInfo &FLI) const {
635552
MachineFunction &MF = MIRBuilder.getMF();
636553
MachineBasicBlock &MBB = MIRBuilder.getMBB();
637554
MachineRegisterInfo &MRI = MF.getRegInfo();
638555
auto &DL = F.getParent()->getDataLayout();
639-
auto &Subtarget = MF.getSubtarget<AArch64Subtarget>();
640-
// TODO: Support Arm64EC
641-
bool IsWin64 = Subtarget.isCallingConvWin64(F.getCallingConv()) && !Subtarget.isWindowsArm64EC();
642556

643557
SmallVector<ArgInfo, 8> SplitArgs;
644558
SmallVector<std::pair<Register, Register>> BoolArgs;
@@ -684,14 +598,13 @@ bool AArch64CallLowering::lowerFormalArguments(
684598
MIRBuilder.setInstr(*MBB.begin());
685599

686600
const AArch64TargetLowering &TLI = *getTLI<AArch64TargetLowering>();
687-
CCAssignFn *AssignFn = TLI.CCAssignFnForCall(F.getCallingConv(), IsWin64);
601+
CCAssignFn *AssignFn =
602+
TLI.CCAssignFnForCall(F.getCallingConv(), /*IsVarArg=*/false);
688603

689604
AArch64IncomingValueAssigner Assigner(AssignFn, AssignFn);
690605
FormalArgHandler Handler(MIRBuilder, MRI);
691-
SmallVector<CCValAssign, 16> ArgLocs;
692-
CCState CCInfo(F.getCallingConv(), F.isVarArg(), MF, ArgLocs, F.getContext());
693-
if (!determineAssignments(Assigner, SplitArgs, CCInfo) ||
694-
!handleAssignments(Handler, SplitArgs, CCInfo, ArgLocs, MIRBuilder))
606+
if (!determineAndHandleAssignments(Handler, Assigner, SplitArgs, MIRBuilder,
607+
F.getCallingConv(), F.isVarArg()))
695608
return false;
696609

697610
if (!BoolArgs.empty()) {
@@ -709,14 +622,10 @@ bool AArch64CallLowering::lowerFormalArguments(
709622
AArch64FunctionInfo *FuncInfo = MF.getInfo<AArch64FunctionInfo>();
710623
uint64_t StackOffset = Assigner.StackOffset;
711624
if (F.isVarArg()) {
712-
if ((!Subtarget.isTargetDarwin() && !Subtarget.isWindowsArm64EC()) || IsWin64) {
713-
// The AAPCS variadic function ABI is identical to the non-variadic
714-
// one. As a result there may be more arguments in registers and we should
715-
// save them for future reference.
716-
// Win64 variadic functions also pass arguments in registers, but all
717-
// float arguments are passed in integer registers.
718-
saveVarArgRegisters(MIRBuilder, Handler, CCInfo);
719-
} else if (Subtarget.isWindowsArm64EC()) {
625+
auto &Subtarget = MF.getSubtarget<AArch64Subtarget>();
626+
if (!Subtarget.isTargetDarwin()) {
627+
// FIXME: we need to reimplement saveVarArgsRegisters from
628+
// AArch64ISelLowering.
720629
return false;
721630
}
722631

@@ -748,6 +657,7 @@ bool AArch64CallLowering::lowerFormalArguments(
748657
// in this function later.
749658
FuncInfo->setBytesInStackArgArea(StackOffset);
750659

660+
auto &Subtarget = MF.getSubtarget<AArch64Subtarget>();
751661
if (Subtarget.hasCustomCallingConv())
752662
Subtarget.getRegisterInfo()->UpdateCustomCalleeSavedRegs(MF);
753663

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

-4
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,6 @@ class AArch64CallLowering: public CallLowering {
6666
using MemHandler =
6767
std::function<void(MachineIRBuilder &, int, CCValAssign &)>;
6868

69-
void saveVarArgRegisters(MachineIRBuilder &MIRBuilder,
70-
CallLowering::IncomingValueHandler &Handler,
71-
CCState &CCInfo) const;
72-
7369
bool lowerTailCall(MachineIRBuilder &MIRBuilder, CallLoweringInfo &Info,
7470
SmallVectorImpl<ArgInfo> &OutArgs) const;
7571

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

+1-9
Original file line numberDiff line numberDiff line change
@@ -1940,18 +1940,10 @@ bool AArch64InstructionSelector::selectVaStartDarwin(
19401940

19411941
Register ArgsAddrReg = MRI.createVirtualRegister(&AArch64::GPR64RegClass);
19421942

1943-
int FrameIdx = FuncInfo->getVarArgsStackIndex();
1944-
if (MF.getSubtarget<AArch64Subtarget>().isCallingConvWin64(
1945-
MF.getFunction().getCallingConv())) {
1946-
FrameIdx = FuncInfo->getVarArgsGPRSize() > 0
1947-
? FuncInfo->getVarArgsGPRIndex()
1948-
: FuncInfo->getVarArgsStackIndex();
1949-
}
1950-
19511943
auto MIB =
19521944
BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(AArch64::ADDXri))
19531945
.addDef(ArgsAddrReg)
1954-
.addFrameIndex(FrameIdx)
1946+
.addFrameIndex(FuncInfo->getVarArgsStackIndex())
19551947
.addImm(0)
19561948
.addImm(0);
19571949

llvm/test/CodeGen/AArch64/GlobalISel/aapcs_vararg_frame.ll

-34
This file was deleted.

llvm/test/CodeGen/AArch64/aarch64_win64cc_vararg.ll

-38
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
22
; RUN: llc < %s -mtriple=aarch64-linux-gnu | FileCheck %s
3-
; RUN: llc < %s --global-isel=1 -mtriple=aarch64-apple-darwin | FileCheck %s --check-prefix=DARWIN
43

54
define win64cc void @pass_va(i32 %count, ...) nounwind {
65
; CHECK-LABEL: pass_va:
@@ -18,12 +17,6 @@ define win64cc void @pass_va(i32 %count, ...) nounwind {
1817
; CHECK-NEXT: ldp x30, x18, [sp, #16] // 16-byte Folded Reload
1918
; CHECK-NEXT: add sp, sp, #96
2019
; CHECK-NEXT: ret
21-
;
22-
; DARWIN: ; %bb.0: ; %entry
23-
; DARWIN-DAG: stp x3, x4, [sp, #56]
24-
; DARWIN-DAG: stp x1, x2, [sp, #40]
25-
; DARWIN-DAG: stp x5, x6, [sp, #72]
26-
; DARWIN-DAG: str x7, [sp, #88]
2720
entry:
2821
%ap = alloca i8*, align 8
2922
%ap1 = bitcast i8** %ap to i8*
@@ -47,16 +40,6 @@ define win64cc i8* @f9(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64
4740
; CHECK-NEXT: str x8, [sp, #8]
4841
; CHECK-NEXT: ldr x18, [sp], #16 // 8-byte Folded Reload
4942
; CHECK-NEXT: ret
50-
;
51-
; DARWIN-LABEL: _f9:
52-
; DARWIN: ; %bb.0: ; %entry
53-
; DARWIN-NEXT: str x18, [sp, #-16]! ; 8-byte Folded Spill
54-
; DARWIN-NEXT: add x8, sp, #8
55-
; DARWIN-NEXT: add x9, sp, #24
56-
; DARWIN-NEXT: str x9, [x8]
57-
; DARWIN-NEXT: ldr x0, [sp, #8]
58-
; DARWIN-NEXT: ldr x18, [sp], #16 ; 8-byte Folded Reload
59-
; DARWIN-NEXT: ret
6043
entry:
6144
%ap = alloca i8*, align 8
6245
%ap1 = bitcast i8** %ap to i8*
@@ -74,16 +57,6 @@ define win64cc i8* @f8(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64
7457
; CHECK-NEXT: str x8, [sp, #8]
7558
; CHECK-NEXT: ldr x18, [sp], #16 // 8-byte Folded Reload
7659
; CHECK-NEXT: ret
77-
;
78-
; DARWIN-LABEL: _f8:
79-
; DARWIN: ; %bb.0: ; %entry
80-
; DARWIN-NEXT: str x18, [sp, #-16]! ; 8-byte Folded Spill
81-
; DARWIN-NEXT: add x8, sp, #8
82-
; DARWIN-NEXT: add x9, sp, #16
83-
; DARWIN-NEXT: str x9, [x8]
84-
; DARWIN-NEXT: ldr x0, [sp, #8]
85-
; DARWIN-NEXT: ldr x18, [sp], #16 ; 8-byte Folded Reload
86-
; DARWIN-NEXT: ret
8760
entry:
8861
%ap = alloca i8*, align 8
8962
%ap1 = bitcast i8** %ap to i8*
@@ -102,17 +75,6 @@ define win64cc i8* @f7(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64
10275
; CHECK-NEXT: str x8, [sp, #8]
10376
; CHECK-NEXT: ldr x18, [sp], #32 // 8-byte Folded Reload
10477
; CHECK-NEXT: ret
105-
;
106-
; DARWIN-LABEL: _f7:
107-
; DARWIN: ; %bb.0: ; %entry
108-
; DARWIN-NEXT: str x18, [sp, #-32]! ; 8-byte Folded Spill
109-
; DARWIN-NEXT: add x8, sp, #8
110-
; DARWIN-NEXT: add x9, sp, #24
111-
; DARWIN-NEXT: str x7, [sp, #24]
112-
; DARWIN-NEXT: str x9, [x8]
113-
; DARWIN-NEXT: ldr x0, [sp, #8]
114-
; DARWIN-NEXT: ldr x18, [sp], #32 ; 8-byte Folded Reload
115-
; DARWIN-NEXT: ret
11678
entry:
11779
%ap = alloca i8*, align 8
11880
%ap1 = bitcast i8** %ap to i8*

0 commit comments

Comments
 (0)