diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2017-09-25 22:00:17 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2017-09-25 22:00:17 +0000 |
commit | 2e0d72311b635a0d68072a6848c819a74d31bd28 (patch) | |
tree | 4cc1614496c5b673e40928289c50343e1e83ea51 /llvm/lib/Target/X86/X86RegisterInfo.cpp | |
parent | 20789a5f096e1682f17f6a6321734fe7e40b939d (diff) | |
download | bcm5719-llvm-2e0d72311b635a0d68072a6848c819a74d31bd28.tar.gz bcm5719-llvm-2e0d72311b635a0d68072a6848c819a74d31bd28.zip |
X86: remove R12 from CSR on Windows x64 SwiftCC
R12 is used for the SwiftError parameter. It is no longer a CSR as it
is used for transfer the SwiftError, and the caller must preserve it if
they need to.
llvm-svn: 314165
Diffstat (limited to 'llvm/lib/Target/X86/X86RegisterInfo.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86RegisterInfo.cpp | 39 |
1 files changed, 19 insertions, 20 deletions
diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp index 343da2573b5..1f49650340e 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.cpp +++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp @@ -271,12 +271,13 @@ X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { assert(MF && "MachineFunction required"); const X86Subtarget &Subtarget = MF->getSubtarget<X86Subtarget>(); + const Function *F = MF->getFunction(); bool HasSSE = Subtarget.hasSSE1(); bool HasAVX = Subtarget.hasAVX(); bool HasAVX512 = Subtarget.hasAVX512(); bool CallsEHReturn = MF->callsEHReturn(); - CallingConv::ID CC = MF->getFunction()->getCallingConv(); + CallingConv::ID CC = F->getCallingConv(); // If attribute NoCallerSavedRegisters exists then we set X86_INTR calling // convention because it has the CSR list. @@ -365,22 +366,20 @@ X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { } if (Is64Bit) { - if (IsWin64) { - if (!HasSSE) - return CSR_Win64_NoSSE_SaveList; - return CSR_Win64_SaveList; - } + bool IsSwiftCC = Subtarget.getTargetLowering()->supportSwiftError() && + F->getAttributes().hasAttrSomewhere(Attribute::SwiftError); + if (IsSwiftCC) + return IsWin64 ? CSR_Win64_SwiftError_SaveList + : CSR_64_SwiftError_SaveList; + + if (IsWin64) + return HasSSE ? CSR_Win64_SaveList : CSR_Win64_NoSSE_SaveList; if (CallsEHReturn) return CSR_64EHRet_SaveList; - if (Subtarget.getTargetLowering()->supportSwiftError() && - MF->getFunction()->getAttributes().hasAttrSomewhere( - Attribute::SwiftError)) - return CSR_64_SwiftError_SaveList; return CSR_64_SaveList; } - if (CallsEHReturn) - return CSR_32EHRet_SaveList; - return CSR_32_SaveList; + + return CallsEHReturn ? CSR_32EHRet_SaveList : CSR_32_SaveList; } const MCPhysReg *X86RegisterInfo::getCalleeSavedRegsViaCopy( @@ -479,14 +478,14 @@ X86RegisterInfo::getCallPreservedMask(const MachineFunction &MF, // Unlike getCalleeSavedRegs(), we don't have MMI so we can't check // callsEHReturn(). if (Is64Bit) { - if (IsWin64) - return CSR_Win64_RegMask; - if (Subtarget.getTargetLowering()->supportSwiftError() && - MF.getFunction()->getAttributes().hasAttrSomewhere( - Attribute::SwiftError)) - return CSR_64_SwiftError_RegMask; - return CSR_64_RegMask; + const Function *F = MF.getFunction(); + bool IsSwiftCC = Subtarget.getTargetLowering()->supportSwiftError() && + F->getAttributes().hasAttrSomewhere(Attribute::SwiftError); + if (IsSwiftCC) + return IsWin64 ? CSR_Win64_SwiftError_RegMask : CSR_64_SwiftError_RegMask; + return IsWin64 ? CSR_Win64_RegMask : CSR_64_RegMask; } + return CSR_32_RegMask; } |