From 8d66df15f4b57357819426a8bce67e9332cf9c9a Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Fri, 15 Jul 2016 20:18:37 +0000 Subject: [PATCH] Teach fast isel about the win64 calling convention. This mostly just works. Vectorcall rets are still not supported. The win64_eh test change is because fast isel doesn't use rsi for temporary computations, so it doesn't need to be pushed. The test case I'm changing was originally added to test pushes, but by now there are other test cases in that file exercising that code path. https://reviews.llvm.org/D22422 llvm-svn: 275607 --- llvm/lib/Target/X86/X86FastISel.cpp | 6 ++---- llvm/test/CodeGen/X86/fast-isel-x86-64.ll | 8 ++++++++ llvm/test/CodeGen/X86/win64_eh.ll | 4 ---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp index fae4527..dfe3c80 100644 --- a/llvm/lib/Target/X86/X86FastISel.cpp +++ b/llvm/lib/Target/X86/X86FastISel.cpp @@ -1153,10 +1153,8 @@ bool X86FastISel::X86SelectRet(const Instruction *I) { CC != CallingConv::X86_FastCall && CC != CallingConv::X86_StdCall && CC != CallingConv::X86_ThisCall && - CC != CallingConv::X86_64_SysV) - return false; - - if (Subtarget->isCallingConvWin64(CC)) + CC != CallingConv::X86_64_SysV && + CC != CallingConv::X86_64_Win64) return false; // Don't handle popping bytes if they don't fit the ret's immediate. diff --git a/llvm/test/CodeGen/X86/fast-isel-x86-64.ll b/llvm/test/CodeGen/X86/fast-isel-x86-64.ll index d748cba..ad0f11f 100644 --- a/llvm/test/CodeGen/X86/fast-isel-x86-64.ll +++ b/llvm/test/CodeGen/X86/fast-isel-x86-64.ll @@ -1,4 +1,5 @@ ; RUN: llc < %s -mattr=-avx -fast-isel -mcpu=core2 -O0 -regalloc=fast -asm-verbose=0 -fast-isel-abort=1 | FileCheck %s +; RUN: llc < %s -mattr=-avx -fast-isel -mcpu=core2 -O0 -regalloc=fast -asm-verbose=0 -fast-isel-verbose 2>&1 >/dev/null | FileCheck %s --check-prefix=STDERR --allow-empty ; RUN: llc < %s -mattr=+avx -fast-isel -mcpu=core2 -O0 -regalloc=fast -asm-verbose=0 -fast-isel-abort=1 | FileCheck %s --check-prefix=AVX target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" @@ -312,3 +313,10 @@ define void @allocamaterialize() { call void @takesi32ptr(i32* %a) ret void } + +; STDERR-NOT: FastISel missed terminator: ret void +; CHECK-LABEL: win64ccfun +define x86_64_win64cc void @win64ccfun(i32 %i) { +; CHECK: ret + ret void +} diff --git a/llvm/test/CodeGen/X86/win64_eh.ll b/llvm/test/CodeGen/X86/win64_eh.ll index cb9d026..9421f00 100644 --- a/llvm/test/CodeGen/X86/win64_eh.ll +++ b/llvm/test/CodeGen/X86/win64_eh.ll @@ -47,7 +47,6 @@ entry: ; WIN64: .seh_endproc -; Checks stack push define i32 @foo3(i32 %f_arg, i32 %e_arg, i32 %d_arg, i32 %c_arg, i32 %b_arg, i32 %a_arg) uwtable { entry: %a = alloca i32 @@ -83,14 +82,11 @@ entry: } ; WIN64-LABEL: foo3: ; WIN64: .seh_proc foo3 -; WIN64: pushq %rsi -; WIN64: .seh_pushreg 6 ; NORM: subq $24, %rsp ; ATOM: leaq -24(%rsp), %rsp ; WIN64: .seh_stackalloc 24 ; WIN64: .seh_endprologue ; WIN64: addq $24, %rsp -; WIN64: popq %rsi ; WIN64: ret ; WIN64: .seh_endproc -- 2.7.4