mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	[Target/X86] Don't use callee-saved registers in a Win64 tail call on non-Windows.
Summary: A small bit that I missed when I updated the X86 backend to account for the Win64 calling convention on non-Windows. Now we don't use dead non-volatile registers when emitting a Win64 indirect tail call on non-Windows. Should fix PR23710. Test Plan: Added test for the correct behavior based on the case I posted to PR23710. Reviewers: rnk Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D10258 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239111 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -175,12 +175,12 @@ X86RegisterInfo::getPointerRegClass(const MachineFunction &MF,
 | 
			
		||||
      return &X86::GR64_NOSPRegClass;
 | 
			
		||||
    return &X86::GR32_NOSPRegClass;
 | 
			
		||||
  case 2: // Available for tailcall (not callee-saved GPRs).
 | 
			
		||||
    if (IsWin64)
 | 
			
		||||
    const Function *F = MF.getFunction();
 | 
			
		||||
    if (IsWin64 || (F && F->getCallingConv() == CallingConv::X86_64_Win64))
 | 
			
		||||
      return &X86::GR64_TCW64RegClass;
 | 
			
		||||
    else if (Is64Bit)
 | 
			
		||||
      return &X86::GR64_TCRegClass;
 | 
			
		||||
 | 
			
		||||
    const Function *F = MF.getFunction();
 | 
			
		||||
    bool hasHipeCC = (F ? F->getCallingConv() == CallingConv::HiPE : false);
 | 
			
		||||
    if (hasHipeCC)
 | 
			
		||||
      return &X86::GR32RegClass;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,11 @@
 | 
			
		||||
; RUN: llc < %s -mtriple=x86_64-pc-linux | FileCheck %s
 | 
			
		||||
 | 
			
		||||
declare x86_64_win64cc void @win64_callee(i32)
 | 
			
		||||
declare x86_64_win64cc void (i32)* @win64_indirect()
 | 
			
		||||
declare x86_64_win64cc void @win64_other(i32)
 | 
			
		||||
declare void @sysv_callee(i32)
 | 
			
		||||
declare void (i32)* @sysv_indirect()
 | 
			
		||||
declare void @sysv_other(i32)
 | 
			
		||||
 | 
			
		||||
define void @sysv_caller(i32 %p1) {
 | 
			
		||||
entry:
 | 
			
		||||
@@ -40,3 +44,23 @@ define x86_64_win64cc void @win64_matched(i32 %p1) {
 | 
			
		||||
 | 
			
		||||
; CHECK-LABEL: win64_matched:
 | 
			
		||||
; CHECK: jmp win64_callee # TAILCALL
 | 
			
		||||
 | 
			
		||||
define x86_64_win64cc void @win64_indirect_caller(i32 %p1) {
 | 
			
		||||
  %1 = call x86_64_win64cc void (i32)* @win64_indirect()
 | 
			
		||||
  call x86_64_win64cc void @win64_other(i32 0)
 | 
			
		||||
  tail call x86_64_win64cc void %1(i32 %p1)
 | 
			
		||||
  ret void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
; CHECK-LABEL: win64_indirect_caller:
 | 
			
		||||
; CHECK: jmpq *%{{rax|rcx|rdx|r8|r9|r11}} # TAILCALL
 | 
			
		||||
 | 
			
		||||
define void @sysv_indirect_caller(i32 %p1) {
 | 
			
		||||
  %1 = call void (i32)* @sysv_indirect()
 | 
			
		||||
  call void @sysv_other(i32 0)
 | 
			
		||||
  tail call void %1(i32 %p1)
 | 
			
		||||
  ret void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
; CHECK-LABEL: sysv_indirect_caller:
 | 
			
		||||
; CHECK: jmpq *%{{rax|rcx|rdx|rsi|rdi|r8|r9|r11}} # TAILCALL
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user