[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