mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-02 05:50:26 +08:00
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:
parent
bdea5c0ead
commit
cac329963a
@ -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
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
27
gcc/testsuite/gcc.target/i386/tailcall-1.c
Normal file
27
gcc/testsuite/gcc.target/i386/tailcall-1.c
Normal 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" } } */
|
Loading…
x
Reference in New Issue
Block a user