[PATCH] x86_64: designate most general purpose and SSE registers as callee save under coldcc

Peter Collingbourne peter at pcc.me.uk
Wed Feb 20 14:10:02 PST 2013


http://llvm-reviews.chandlerc.com/D435

Files:
  lib/Target/X86/X86CallingConv.td
  lib/Target/X86/X86RegisterInfo.cpp
  test/CodeGen/X86/coldcc64.ll

Index: lib/Target/X86/X86CallingConv.td
===================================================================
--- lib/Target/X86/X86CallingConv.td
+++ lib/Target/X86/X86CallingConv.td
@@ -519,6 +519,9 @@
 def CSR_Win64 : CalleeSavedRegs<(add RBX, RBP, RDI, RSI, R12, R13, R14, R15,
                                      (sequence "XMM%u", 6, 15))>;
 
+def CSR_MostRegs_64 : CalleeSavedRegs<(add RBX, RCX, RDX, RSI, RDI, R8, R9, R10,
+                                           R11, R12, R13, R14, R15, RBP,
+                                           (sequence "XMM%u", 0, 15))>;
 
 // Standard C + YMM6-15
 def CSR_Win64_Intel_OCL_BI_AVX : CalleeSavedRegs<(add RBX, RBP, RDI, RSI, R12,
Index: lib/Target/X86/X86RegisterInfo.cpp
===================================================================
--- lib/Target/X86/X86RegisterInfo.cpp
+++ lib/Target/X86/X86RegisterInfo.cpp
@@ -239,14 +239,16 @@
   bool ghcCall = false;
   bool oclBiCall = false;
   bool hipeCall = false;
+  bool coldCall = false;
   bool HasAVX = TM.getSubtarget<X86Subtarget>().hasAVX();
 
   if (MF) {
     callsEHReturn = MF->getMMI().callsEHReturn();
     const Function *F = MF->getFunction();
     ghcCall = (F ? F->getCallingConv() == CallingConv::GHC : false);
     oclBiCall = (F ? F->getCallingConv() == CallingConv::Intel_OCL_BI : false);
     hipeCall = (F ? F->getCallingConv() == CallingConv::HiPE : false);
+    coldCall = (F ? F->getCallingConv() == CallingConv::Cold : false);
   }
 
   if (ghcCall || hipeCall)
@@ -260,6 +262,8 @@
         return CSR_64_Intel_OCL_BI_SaveList;
   }
   if (Is64Bit) {
+    if (coldCall)
+      return CSR_MostRegs_64_SaveList;
     if (IsWin64)
       return CSR_Win64_SaveList;
     if (callsEHReturn)
@@ -287,6 +291,8 @@
     return CSR_NoRegs_RegMask;
   if (!Is64Bit)
     return CSR_32_RegMask;
+  if (CC == CallingConv::Cold)
+    return CSR_MostRegs_64_RegMask;
   if (IsWin64)
     return CSR_Win64_RegMask;
   return CSR_64_RegMask;
Index: test/CodeGen/X86/coldcc64.ll
===================================================================
--- /dev/null
+++ test/CodeGen/X86/coldcc64.ll
@@ -0,0 +1,69 @@
+; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck %s
+
+define coldcc i64 @foo(i64 %a) {
+; CHECK: pushq %rbp
+; CHECK: pushq %r15
+; CHECK: pushq %r14
+; CHECK: pushq %r13
+; CHECK: pushq %r12
+; CHECK: pushq %r11
+; CHECK: pushq %r10
+; CHECK: pushq %r9
+; CHECK: pushq %r8
+; CHECK: pushq %rdi
+; CHECK: pushq %rsi
+; CHECK: pushq %rdx
+; CHECK: pushq %rcx
+; CHECK: pushq %rbx
+  %b = add i64 %a, %a
+  %c = add i64 %b, %b
+  %d = add i64 %c, %c
+  %e = add i64 %d, %d
+  %f = add i64 %e, %e
+  %g = add i64 %f, %f
+  %h = add i64 %g, %g
+  %i = add i64 %h, %h
+  %j = add i64 %i, %i
+  %k = add i64 %j, %j
+  %l = add i64 %k, %k
+  %m = add i64 %l, %l
+  %n = add i64 %m, %m
+  %o = add i64 %n, %n
+  %p = add i64 %o, %o
+  %q = add i64 %p, %p
+  %r = add i64 %q, %q
+  %s = add i64 %r, %r
+  %t = add i64 %s, %s
+  %u = add i64 %t, %t
+  %v = add i64 %u, %u
+  %w = add i64 %v, %v
+  %x = add i64 %w, %w
+  %y = add i64 %x, %x
+  %z = add i64 %y, %y
+  %b1 = add i64 %a, %z
+  %c1 = add i64 %b, %b1
+  %d1 = add i64 %c, %c1
+  %e1 = add i64 %d, %d1
+  %f1 = add i64 %e, %e1
+  %g1 = add i64 %f, %f1
+  %h1 = add i64 %g, %g1
+  %i1 = add i64 %h, %h1
+  %j1 = add i64 %i, %i1
+  %k1 = add i64 %j, %j1
+  %l1 = add i64 %k, %k1
+  %m1 = add i64 %l, %l1
+  %n1 = add i64 %m, %m1
+  %o1 = add i64 %n, %n1
+  %p1 = add i64 %o, %o1
+  %q1 = add i64 %p, %p1
+  %r1 = add i64 %q, %q1
+  %s1 = add i64 %r, %r1
+  %t1 = add i64 %s, %s1
+  %u1 = add i64 %t, %t1
+  %v1 = add i64 %u, %u1
+  %w1 = add i64 %v, %v1
+  %x1 = add i64 %w, %w1
+  %y1 = add i64 %x, %x1
+  %z1 = add i64 %y, %y1
+  ret i64 %z1
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D435.1.patch
Type: text/x-patch
Size: 3732 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130220/2f332497/attachment.bin>


More information about the llvm-commits mailing list