re PR rtl-optimization/7675 (ICE in fixup_var_refs_1)

PR optimization/7675
	* c-typeck.c (build_external_ref): Set the DECL_NONLOCAL flag
	on VAR_DECL, PARM_DECL and FUNCTION_DECL from within
	nested functions if they refer to declarations from parent functions.
	* stmt.c (expand_decl): Don't put automatic variables in registers
	if the DECL_NONLOCAL flag is set.

From-SVN: r65774
This commit is contained in:
Eric Botcazou 2003-04-18 08:45:15 +02:00 committed by Eric Botcazou
parent 06e7ca50ab
commit 6a29edeae5
5 changed files with 41 additions and 0 deletions

View File

@ -1,3 +1,12 @@
2003-04-18 Eric Botcazou <ebotcazou@libertysurf.fr>
PR optimization/7675
* c-typeck.c (build_external_ref): Set the DECL_NONLOCAL flag
on VAR_DECL, PARM_DECL and FUNCTION_DECL from within
nested functions if they refer to declarations from parent functions.
* stmt.c (expand_decl): Don't put automatic variables in registers
if the DECL_NONLOCAL flag is set.
2003-04-18 Hans-Peter Nilsson <hp@bitrange.com>
* gcse.c (compute_ld_motion_mems): For MEM destinations, only

View File

@ -1463,6 +1463,17 @@ build_external_ref (id, fun)
ref = DECL_INITIAL (ref);
TREE_CONSTANT (ref) = 1;
}
else if (current_function_decl != 0
&& DECL_CONTEXT (current_function_decl) != 0
&& (TREE_CODE (ref) == VAR_DECL
|| TREE_CODE (ref) == PARM_DECL
|| TREE_CODE (ref) == FUNCTION_DECL))
{
tree context = decl_function_context (ref);
if (context != 0 && context != current_function_decl)
DECL_NONLOCAL (ref) = 1;
}
return ref;
}

View File

@ -3924,6 +3924,7 @@ expand_decl (decl)
&& !(flag_float_store
&& TREE_CODE (type) == REAL_TYPE)
&& ! TREE_THIS_VOLATILE (decl)
&& ! DECL_NONLOCAL (decl)
&& (DECL_REGISTER (decl) || optimize))
{
/* Automatic variable that can go in a register. */

View File

@ -1,3 +1,7 @@
2003-04-18 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.c-torture/compile/20030418-1.c: New test.
2003-04-17 Janis Johnson <janis187@us.ibm.com>
* README.compat: Remove; content moved to doc/sourcebuild.texi.

View File

@ -0,0 +1,16 @@
/* PR optimization/7675 */
/* Contributed by Volker Reichelt */
/* Verify that we don't put automatic variables
in registers too early. */
extern int dummy (int *);
void foo(int i)
{
int j=i;
void bar() { int x=j, y=i; }
dummy(&i);
}