From f3d3a8e25ed135d4c539aed7203030dc140d4820 Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Fri, 18 Apr 2003 06:45:15 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65774 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 +++++++++ gcc/c-typeck.c | 11 +++++++++++ gcc/stmt.c | 1 + gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.c-torture/compile/20030418-1.c | 16 ++++++++++++++++ 5 files changed, 41 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20030418-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index abbec33..68c3d86 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2003-04-18 Eric Botcazou + + 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 * gcse.c (compute_ld_motion_mems): For MEM destinations, only diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 4c14b5f..871e108 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -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; } diff --git a/gcc/stmt.c b/gcc/stmt.c index 642a5b1..9caa5c2 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fb5d59e..99c3b2b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-04-18 Eric Botcazou + + * gcc.c-torture/compile/20030418-1.c: New test. + 2003-04-17 Janis Johnson * README.compat: Remove; content moved to doc/sourcebuild.texi. diff --git a/gcc/testsuite/gcc.c-torture/compile/20030418-1.c b/gcc/testsuite/gcc.c-torture/compile/20030418-1.c new file mode 100644 index 0000000..f6d5a4a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20030418-1.c @@ -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); +} -- 2.7.4