aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@libertysurf.fr>2003-04-18 08:45:15 +0200
committerEric Botcazou <ebotcazou@gcc.gnu.org>2003-04-18 06:45:15 +0000
commit6a29edeae52a48b159ebe4eb024be65b8d69eb9b (patch)
treee0dee3b9bf6420657cea4b3e36c2550d4e9614f9 /gcc
parent06e7ca50abc3a0a39798d38672110abbd3a8dcc3 (diff)
downloadgcc-6a29edeae52a48b159ebe4eb024be65b8d69eb9b.zip
gcc-6a29edeae52a48b159ebe4eb024be65b8d69eb9b.tar.gz
gcc-6a29edeae52a48b159ebe4eb024be65b8d69eb9b.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/c-typeck.c11
-rw-r--r--gcc/stmt.c1
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20030418-1.c16
5 files changed, 41 insertions, 0 deletions
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 <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
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index 4c14b5f9..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 <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.
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);
+}