summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86RegisterInfo.cpp
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2017-09-25 22:00:17 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2017-09-25 22:00:17 +0000
commit2e0d72311b635a0d68072a6848c819a74d31bd28 (patch)
tree4cc1614496c5b673e40928289c50343e1e83ea51 /llvm/lib/Target/X86/X86RegisterInfo.cpp
parent20789a5f096e1682f17f6a6321734fe7e40b939d (diff)
downloadbcm5719-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.cpp39
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;
}
OpenPOWER on IntegriCloud