re PR target/23289 (tail call optimization not performed)

2005-08-11  Richard Guenther  <rguenther@suse.de>

	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
This commit is contained in:
Richard Guenther 2005-08-11 08:59:22 +00:00 committed by Richard Biener
parent bdea5c0ead
commit cac329963a
4 changed files with 48 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2005-08-11 Richard Guenther <rguenther@suse.de>
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 <phython@gcc.gnu.org>
PR c++/23225

View File

@ -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

View File

@ -1,3 +1,8 @@
2005-08-11 Richard Guenther <rguenther@suse.de>
PR target/23289
* gcc.target/i386/tailcall-1.c: New testcase.
2005-08-10 James A. Morrison <phython@gc.gnu.org>
* gcc.dg/vect/vect-67.c: Un-xfail.

View File

@ -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" } } */