From ecdf45b1e6b37ec44681b5fc687f0c94578491af Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Thu, 14 Jul 2016 13:54:26 +0000 Subject: [PATCH] Teach fast isel calls and rets about stdcall. stdcall is callee-pop like thiscall, so the thiscall changes already did most of the work for this. This change only opts stdcall in and adds tests. llvm-svn: 275414 --- llvm/lib/Target/X86/X86FastISel.cpp | 2 ++ llvm/test/CodeGen/X86/fast-isel-call.ll | 15 ++++++++++++++- llvm/test/CodeGen/X86/fast-isel-x86.ll | 20 +++++++++++++++----- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp index 182731f..fae4527 100644 --- a/llvm/lib/Target/X86/X86FastISel.cpp +++ b/llvm/lib/Target/X86/X86FastISel.cpp @@ -1151,6 +1151,7 @@ bool X86FastISel::X86SelectRet(const Instruction *I) { if (CC != CallingConv::C && CC != CallingConv::Fast && CC != CallingConv::X86_FastCall && + CC != CallingConv::X86_StdCall && CC != CallingConv::X86_ThisCall && CC != CallingConv::X86_64_SysV) return false; @@ -3025,6 +3026,7 @@ bool X86FastISel::fastLowerCall(CallLoweringInfo &CLI) { case CallingConv::WebKit_JS: case CallingConv::Swift: case CallingConv::X86_FastCall: + case CallingConv::X86_StdCall: case CallingConv::X86_ThisCall: case CallingConv::X86_64_Win64: case CallingConv::X86_64_SysV: diff --git a/llvm/test/CodeGen/X86/fast-isel-call.ll b/llvm/test/CodeGen/X86/fast-isel-call.ll index 945fdf0..6823a0e 100644 --- a/llvm/test/CodeGen/X86/fast-isel-call.ll +++ b/llvm/test/CodeGen/X86/fast-isel-call.ll @@ -57,7 +57,7 @@ define void @test4(i8* %a, i8* %b) { ; STDERR-NOT: FastISel missed call: call x86_thiscallcc void @thiscallfun %struct.S = type { i8 } -define void @test5() #0 { +define void @test5() { entry: %s = alloca %struct.S, align 1 ; CHECK-LABEL: test5: @@ -70,3 +70,16 @@ entry: ret void } declare x86_thiscallcc void @thiscallfun(%struct.S*, i32) #1 + +; STDERR-NOT: FastISel missed call: call x86_stdcallcc void @stdcallfun +define void @test6() { +entry: +; CHECK-LABEL: test6: +; CHECK: subl $12, %esp +; CHECK: movl $43, (%esp) +; CHECK: calll {{.*}}stdcallfun +; CHECK: addl $8, %esp + call x86_stdcallcc void @stdcallfun(i32 43) + ret void +} +declare x86_stdcallcc void @stdcallfun(i32) #1 diff --git a/llvm/test/CodeGen/X86/fast-isel-x86.ll b/llvm/test/CodeGen/X86/fast-isel-x86.ll index 64340bf..8cddee5 100644 --- a/llvm/test/CodeGen/X86/fast-isel-x86.ll +++ b/llvm/test/CodeGen/X86/fast-isel-x86.ll @@ -1,4 +1,5 @@ ; RUN: llc -fast-isel -O0 -mcpu=generic -mtriple=i386-apple-darwin10 -relocation-model=pic < %s | FileCheck %s +; RUN: llc -fast-isel -O0 -mcpu=generic -mtriple=i386-apple-darwin10 -relocation-model=pic < %s -fast-isel-verbose 2>&1 >/dev/null | FileCheck -check-prefix=STDERR -allow-empty %s ; This should use flds to set the return value. ; CHECK-LABEL: test0: @@ -21,8 +22,9 @@ define void @test1({i32, i32, i32, i32}* sret %p) nounwind { ; This should pop 8 bytes on return. ; CHECK-LABEL: thiscallfun: ; CHECK: retl $8 -define x86_thiscallcc void @thiscallfun(i32* %this, i32 %a, i32 %b) nounwind { - ret void +define x86_thiscallcc i32 @thiscallfun(i32* %this, i32 %a, i32 %b) nounwind { +; STDERR-NOT: FastISel missed terminator: ret i32 12345 + ret i32 12345 } ; Here, the callee pop doesn't fit the 16 bit immediate -- see x86-big-ret.ll @@ -36,11 +38,19 @@ define x86_thiscallcc void @thiscall_large(i32* %this, [65533 x i8]* byval %b) n ret void } +; This should pop 4 bytes on return. +; CHECK-LABEL: stdcallfun: +; CHECK: retl $4 +define x86_stdcallcc i32 @stdcallfun(i32 %a) nounwind { +; STDERR-NOT: FastISel missed terminator: ret i32 54321 + ret i32 54321 +} + ; Properly initialize the pic base. ; CHECK-LABEL: test2: ; CHECK-NOT: HHH -; CHECK: call{{.*}}L4$pb -; CHECK-NEXT: L4$pb: +; CHECK: call{{.*}}L5$pb +; CHECK-NEXT: L5$pb: ; CHECK-NEXT: pop ; CHECK: HHH ; CHECK: retl @@ -93,7 +103,7 @@ entry: ; SDag-ISel's arg push: ; CHECK: movl %esp, [[REGISTER:%[a-z]+]] ; CHECK: movl $42, ([[REGISTER]]) -; CHECK: movl L_test5dllimport$non_lazy_ptr-L7$pb(%eax), %eax +; CHECK: movl L_test5dllimport$non_lazy_ptr-L8$pb(%eax), %eax } declare dllimport i32 @test5dllimport(i32) -- 2.7.4