From cac329963a81d95f7f04ece46bbc07786e954e40 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Thu, 11 Aug 2005 08:59:22 +0000 Subject: [PATCH] re PR target/23289 (tail call optimization not performed) 2005-08-11 Richard Guenther PR target/23289 * config/i386/i386.c (ix86_function_ok_for_sibcall): Handle cases where we call to/from functions returning void. * gcc.target/i386/tailcall-1.c: New testcase. From-SVN: r102981 --- gcc/ChangeLog | 6 +++++ gcc/config/i386/i386.c | 12 ++++++++-- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.target/i386/tailcall-1.c | 27 ++++++++++++++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/tailcall-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2c0950529ce..a6715d0dbd3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-08-11 Richard Guenther + + PR target/23289 + * config/i386/i386.c (ix86_function_ok_for_sibcall): Handle + cases where we call to/from functions returning void. + 2005-08-10 James A. Morrison PR c++/23225 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 68589b28da9..3c62bf0c554 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -1907,6 +1907,7 @@ ix86_function_ok_for_sibcall (tree decl, tree exp) { tree func; rtx a, b; + bool one_void, one_reg; /* If we are generating position-independent code, we cannot sibcall optimize any indirect call, or a direct call to a global function, @@ -1929,11 +1930,18 @@ ix86_function_ok_for_sibcall (tree decl, tree exp) function that does or, conversely, from a function that does return a float to a function that doesn't; the necessary stack adjustment would not be executed. This is also the place we notice - differences in the return value ABI. */ + differences in the return value ABI. Note that it is ok for one + of the functions to have void return type as long as the return + value of the other is passed in a register. */ a = ix86_function_value (TREE_TYPE (exp), func, false); b = ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)), cfun->decl, false); - if (! rtx_equal_p (a, b)) + one_void = (VOID_TYPE_P (TREE_TYPE (exp)) + || VOID_TYPE_P (TREE_TYPE (DECL_RESULT (cfun->decl)))); + one_reg = ((REG_P (a) && !STACK_REG_P (a)) + || (REG_P (b) && !STACK_REG_P (b))); + if (!(one_void && one_reg) + && !rtx_equal_p (a, b)) return false; /* If this call is indirect, we'll need to be able to use a call-clobbered diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dd74474cba4..8a296288ab9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-08-11 Richard Guenther + + PR target/23289 + * gcc.target/i386/tailcall-1.c: New testcase. + 2005-08-10 James A. Morrison * gcc.dg/vect/vect-67.c: Un-xfail. diff --git a/gcc/testsuite/gcc.target/i386/tailcall-1.c b/gcc/testsuite/gcc.target/i386/tailcall-1.c new file mode 100644 index 00000000000..b916b6c7c1e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/tailcall-1.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef unsigned int Cardinal; +typedef char *String; +typedef struct _WidgetRec *Widget; + +typedef union _XEvent { + int type; + long pad[24]; +} XEvent; + + +extern int SendMousePosition (Widget w, XEvent* event); + + +void +HandleIgnore(Widget w, + XEvent * event, + String * params , + Cardinal *param_count ) +{ + + (void) SendMousePosition(w, event); +} + +/* { dg-final { scan-assembler "jmp" } } */ -- 2.30.2