[llvm] r282819 - [X86] Don't preserve Win64 SSE CSRs when SSE is disabled
Reid Kleckner via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 29 17:17:50 PDT 2016
Author: rnk
Date: Thu Sep 29 19:17:49 2016
New Revision: 282819
URL: http://llvm.org/viewvc/llvm-project?rev=282819&view=rev
Log:
[X86] Don't preserve Win64 SSE CSRs when SSE is disabled
Code that doesn't use floating point and doesn't use SSE (kernel code)
shouldn't save and restore SSE registers.
Fixes PR30503
Added:
llvm/trunk/test/CodeGen/X86/win64-nosse-csrs.ll
Modified:
llvm/trunk/lib/Target/X86/X86CallingConv.td
llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp
Modified: llvm/trunk/lib/Target/X86/X86CallingConv.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86CallingConv.td?rev=282819&r1=282818&r2=282819&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86CallingConv.td (original)
+++ llvm/trunk/lib/Target/X86/X86CallingConv.td Thu Sep 29 19:17:49 2016
@@ -863,7 +863,9 @@ def CSR_64_SwiftError : CalleeSavedRegs<
def CSR_32EHRet : CalleeSavedRegs<(add EAX, EDX, CSR_32)>;
def CSR_64EHRet : CalleeSavedRegs<(add RAX, RDX, CSR_64)>;
-def CSR_Win64 : CalleeSavedRegs<(add RBX, RBP, RDI, RSI, R12, R13, R14, R15,
+def CSR_Win64_NoSSE : CalleeSavedRegs<(add RBX, RBP, RDI, RSI, R12, R13, R14, R15)>;
+
+def CSR_Win64 : CalleeSavedRegs<(add CSR_Win64_NoSSE,
(sequence "XMM%u", 6, 15))>;
// The function used by Darwin to obtain the address of a thread-local variable
Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp?rev=282819&r1=282818&r2=282819&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Thu Sep 29 19:17:49 2016
@@ -311,6 +311,8 @@ X86RegisterInfo::getCalleeSavedRegs(cons
return CSR_64_MostRegs_SaveList;
break;
case CallingConv::X86_64_Win64:
+ if (!HasSSE)
+ return CSR_Win64_NoSSE_SaveList;
return CSR_Win64_SaveList;
case CallingConv::X86_64_SysV:
if (CallsEHReturn)
@@ -337,8 +339,11 @@ X86RegisterInfo::getCalleeSavedRegs(cons
}
if (Is64Bit) {
- if (IsWin64)
+ if (IsWin64) {
+ if (!HasSSE)
+ return CSR_Win64_NoSSE_SaveList;
return CSR_Win64_SaveList;
+ }
if (CallsEHReturn)
return CSR_64EHRet_SaveList;
if (Subtarget.getTargetLowering()->supportSwiftError() &&
Added: llvm/trunk/test/CodeGen/X86/win64-nosse-csrs.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/win64-nosse-csrs.ll?rev=282819&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/win64-nosse-csrs.ll (added)
+++ llvm/trunk/test/CodeGen/X86/win64-nosse-csrs.ll Thu Sep 29 19:17:49 2016
@@ -0,0 +1,30 @@
+; RUN: llc < %s -mattr="-sse,-mmx,+soft-float" | FileCheck %s
+
+; CHECK: peach:
+; CHECK: pushq %rsi
+; CHECK: pushq %rdi
+; CHECK-NOT: movaps
+; CHECK: callq banana
+; CHECK-NOT: movaps
+; CHECK: popq %rdi
+; CHECK: popq %rsi
+; CHECK: retq
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; Function Attrs: uwtable
+define internal i64 @banana() unnamed_addr #0 {
+entry-block:
+ ret i64 0
+}
+
+; Function Attrs: nounwind uwtable
+define x86_64_win64cc i64 @peach() unnamed_addr #1 {
+entry-block:
+ %0 = call i64 @banana()
+ ret i64 %0
+}
+
+attributes #0 = { uwtable }
+attributes #1 = { nounwind uwtable }
More information about the llvm-commits
mailing list