Commit 5fbf0217 by Eric Botcazou Committed by Eric Botcazou

re PR c/9530 (ICE on missing return statement)

	PR c/9530
	* config/i386/i386.c (ix86_function_ok_for_sibcall): Forbid sibcalls
	from functions that return a float to functions that don't.

Co-Authored-By: Richard Henderson <rth@redhat.com>

From-SVN: r62480
parent 8f62128d
2003-02-06 Eric Botcazou <ebotcazou@libertysurf.fr>
Richard Henderson <rth@redhat.com>
PR c/9530
* config/i386/i386.c (ix86_function_ok_for_sibcall): Forbid sibcalls
from functions that return a float to functions that don't.
Thu Feb 6 00:18:38 CET 2003 Jan Hubicka <jh@suse.cz> Thu Feb 6 00:18:38 CET 2003 Jan Hubicka <jh@suse.cz>
* i386.c (x86_inter_unit_moves): New variable. * i386.c (x86_inter_unit_moves): New variable.
......
...@@ -1482,11 +1482,9 @@ const struct attribute_spec ix86_attribute_table[] = ...@@ -1482,11 +1482,9 @@ const struct attribute_spec ix86_attribute_table[] =
{ NULL, 0, 0, false, false, false, NULL } { NULL, 0, 0, false, false, false, NULL }
}; };
/* If PIC, we cannot make sibling calls to global functions /* Decide whether we can make a sibling call to a function. DECL is the
because the PLT requires %ebx live. declaration of the function being targeted by the call and EXP is the
If we are returning floats on the register stack, we cannot make CALL_EXPR representing the call. */
sibling calls to functions that return floats. (The stack adjust
instruction will wind up after the sibcall jump, and not be executed.) */
static bool static bool
ix86_function_ok_for_sibcall (decl, exp) ix86_function_ok_for_sibcall (decl, exp)
...@@ -1501,10 +1499,11 @@ ix86_function_ok_for_sibcall (decl, exp) ...@@ -1501,10 +1499,11 @@ ix86_function_ok_for_sibcall (decl, exp)
/* If we are returning floats on the 80387 register stack, we cannot /* If we are returning floats on the 80387 register stack, we cannot
make a sibcall from a function that doesn't return a float to a make a sibcall from a function that doesn't return a float to a
function that does; the necessary stack adjustment will not be function that does or, conversely, from a function that does return
executed. */ a float to a function that doesn't; the necessary stack adjustment
would not be executed. */
if (STACK_REG_P (ix86_function_value (TREE_TYPE (exp))) if (STACK_REG_P (ix86_function_value (TREE_TYPE (exp)))
&& ! STACK_REG_P (ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl))))) != STACK_REG_P (ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)))))
return false; return false;
/* If this call is indirect, we'll need to be able to use a call-clobbered /* If this call is indirect, we'll need to be able to use a call-clobbered
......
2003-02-06 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.c-torture/compile/20030206-1.c: New test.
2003-02-05 Roger Sayle <roger@eyesopen.com> 2003-02-05 Roger Sayle <roger@eyesopen.com>
* gcc.c-torture/compile/921206-1.c: Rename undeclared function from * gcc.c-torture/compile/921206-1.c: Rename undeclared function from
......
/* PR c/9530 */
/* Contributed by Volker Reichelt. */
/* Verify that the call to 'foo' is not turned
into a sibling call. */
void foo(float d);
float bar(float d);
float baz(float d)
{
foo(bar(d));
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment