re PR rtl-optimization/12544 (ICE with large parameters used in nested functions)
authorEric Botcazou <ebotcazou@libertysurf.fr>
Sat, 11 Oct 2003 20:56:24 +0000 (22:56 +0200)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 11 Oct 2003 20:56:24 +0000 (20:56 +0000)
PR optimization/12544
* function.c (put_var_into_stack): Don't generate ADDRESSOFs
for DECL_NONLOCAL decls.

From-SVN: r72374

gcc/ChangeLog
gcc/function.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20031011-1.c [new file with mode: 0644]

index 2012c2b08182452139d503ba6f7485577fb5bd7f..8a7ff9737bc6c0686ccd87c2f40e63297a4e1df7 100644 (file)
@@ -1,3 +1,9 @@
+2003-10-11  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       PR optimization/12544
+       * function.c (put_var_into_stack): Don't generate ADDRESSOFs
+       for DECL_NONLOCAL decls.
+
 2003-10-11  Kazu Hirata  <kazu@cs.umass.edu>
 
        * expr.c: Follow spelling conventions.
index 427469eb8aec49929ec1e574f1105d61fe454867..6531c022f9e0f8725c3df23fc7a334805cea20be 100644 (file)
@@ -1324,8 +1324,9 @@ put_var_into_stack (tree decl, int rescan)
       if (function->decl == context)
        break;
 
-  /* If this is a variable-size object with a pseudo to address it,
-     put that pseudo into the stack, if the var is nonlocal.  */
+  /* If this is a variable-sized object or a structure passed by invisible
+     reference, with a pseudo to address it, put that pseudo into the stack
+     if the var is non-local.  */
   if (TREE_CODE (decl) != SAVE_EXPR && DECL_NONLOCAL (decl)
       && GET_CODE (reg) == MEM
       && GET_CODE (XEXP (reg, 0)) == REG
@@ -1335,8 +1336,12 @@ put_var_into_stack (tree decl, int rescan)
       decl_mode = promoted_mode = GET_MODE (reg);
     }
 
+  /* If this variable lives in the current function and we don't need to put it
+     in the stack for the sake of setjmp or the non-locality, try to keep it in
+     a register until we know we actually need the address.  */
   can_use_addressof
     = (function == 0
+       && ! (TREE_CODE (decl) != SAVE_EXPR && DECL_NONLOCAL (decl))
        && optimize > 0
        /* FIXME make it work for promoted modes too */
        && decl_mode == promoted_mode
@@ -1355,9 +1360,6 @@ put_var_into_stack (tree decl, int rescan)
 
   if (GET_CODE (reg) == REG)
     {
-      /* If this variable lives in the current function and we don't need
-        to put things in the stack for the sake of setjmp, try to keep it
-        in a register until we know we actually need the address.  */
       if (can_use_addressof)
        gen_mem_addressof (reg, decl, rescan);
       else
index b7b24ac6cf674205271a8f6742d8691e1695729d..9c10508818b33c772424f1d64d04383448307298 100644 (file)
@@ -1,3 +1,7 @@
+2003-10-11  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       * gcc.c-torture/compile/20031011-1.c: New test.
+
 Sat Oct 11 12:26:16 CEST 2003  Jan Hubicka  <jh@suse.cz>
 
        * g++.dg/other/first-global.C: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/20031011-1.c b/gcc/testsuite/gcc.c-torture/compile/20031011-1.c
new file mode 100644 (file)
index 0000000..e35d762
--- /dev/null
@@ -0,0 +1,21 @@
+/* PR optimization/12544 */
+/* Origin: Tony Hosking <hosking@cs.purdue.edu> */
+
+/* Verify that non-local structures passed by invisible
+   reference are correctly put in the stack.  */
+
+typedef struct {
+  int a;
+  int f;
+} A;
+
+A *b;
+
+void x (A a) {
+  void y () {
+    a.a = 0;
+  }
+
+  b = &a;
+  y();
+}