re PR tree-optimization/15077 (ICE in make_decl_rtl when inlining tail recursive...
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>
Wed, 28 Jul 2004 02:27:20 +0000 (02:27 +0000)
committerRichard Kenner <kenner@gcc.gnu.org>
Wed, 28 Jul 2004 02:27:20 +0000 (22:27 -0400)
PR optimization/15077
* function.h (struct function): Add field saved_static_chain_decl.
Fix comment for static_chain_decl.
* tree-inline.c (save_body): Add new arg and handle static_chain_decl.
* tree-inline.h (save_body): Add new arg.
* tree-optimize.c (tree_rest_of_compilation): Handle saving
static_chain_decl.

From-SVN: r85247

gcc/ChangeLog
gcc/function.h
gcc/tree-inline.c
gcc/tree-inline.h
gcc/tree-optimize.c

index f19695ff364fd6c44de6670f177f89c93d81f298..b1d01918c1e07c80466a8347913d1034e7fd4b11 100644 (file)
@@ -1,3 +1,13 @@
+2004-07-27  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
+
+       PR optimization/15077
+       * function.h (struct function): Add field saved_static_chain_decl.
+       Fix comment for static_chain_decl.
+       * tree-inline.c (save_body): Add new arg and handle static_chain_decl.
+       * tree-inline.h (save_body): Add new arg.
+       * tree-optimize.c (tree_rest_of_compilation): Handle saving
+       static_chain_decl.
+
 2004-07-27  Richard Henderson  <rth@redhat.com>
 
        * gimplify.c (is_gimple_addr_expr_arg_or_indirect): Remove.
index 60baf84e12debbe24cda95ac661292a24d8f2a66..b3e750fd6b0b67f3fe30513137720b1c67f5e26f 100644 (file)
@@ -173,6 +173,7 @@ struct function GTY(())
      inlining */
   tree saved_tree;
   tree saved_args;
+  tree saved_static_chain_decl;
 
   /* For function.c.  */
 
@@ -254,7 +255,7 @@ struct function GTY(())
      If stack grows up, this is the address for the next slot.  */
   HOST_WIDE_INT x_frame_offset;
 
-  /* A VAR_DECL that should contain the static chain for this function.
+  /* A PARM_DECL that should contain the static chain for this function.
      It will be initialized at the beginning of the function.  */
   tree static_chain_decl;
 
index 6412ce0306d27e3de8cd75e89419e892d1ecf339..139661e4b507f2730132e745ca434cf473e93943 100644 (file)
@@ -1877,10 +1877,11 @@ clone_body (tree clone, tree fn, void *arg_map)
   append_to_statement_list_force (copy_body (&id), &DECL_SAVED_TREE (clone));
 }
 
-/* Save duplicate of body in FN.  MAP is used to pass around splay tree
-   used to update arguments in restore_body.  */
+/* Make and return duplicate of body in FN.  Put copies of DECL_ARGUMENTS
+   in *arg_copy and of the static chain, if any, in *sc_copy.  */
+
 tree
-save_body (tree fn, tree *arg_copy)
+save_body (tree fn, tree *arg_copy, tree *sc_copy)
 {
   inline_data id;
   tree body, *parg;
@@ -1904,6 +1905,18 @@ save_body (tree fn, tree *arg_copy)
       *parg = new;
     }
 
+  *sc_copy = DECL_STRUCT_FUNCTION (fn)->static_chain_decl;
+  if (*sc_copy)
+    {
+      tree new = copy_node (*sc_copy);
+
+      lang_hooks.dup_lang_specific_decl (new);
+      DECL_ABSTRACT_ORIGIN (new) = DECL_ORIGIN (*sc_copy);
+      insert_decl_map (&id, *sc_copy, new);
+      TREE_CHAIN (new) = TREE_CHAIN (*sc_copy);
+      *sc_copy = new;
+    }
+
   insert_decl_map (&id, DECL_RESULT (fn), DECL_RESULT (fn));
 
   /* Actually copy the body.  */
index 4619e314bef290449e20038ca5424df30017701e..b62b42447e90269275097105fbb3b2383b279c17 100644 (file)
@@ -26,10 +26,10 @@ Boston, MA 02111-1307, USA.  */
 
 void optimize_inline_calls (tree);
 bool tree_inlinable_function_p (tree);
-tree copy_tree_r (tree*, int*, void*);
-void clone_body (tree, tree, void*);
-tree save_body (tree, tree *);
-void remap_save_expr (tree*, void*, int*);
+tree copy_tree_r (tree *, int *, void *);
+void clone_body (tree, tree, void *);
+tree save_body (tree, tree *, tree *);
+void remap_save_expr (tree *, void *, int *);
 int estimate_num_insns (tree expr);
 
 /* 0 if we should not perform inlining.
index 7cdb30bbcf4cd295e23d01d151c777d686cbd07b..d575990cce67d58c7cbef715e6da9ac6bd06ef12 100644 (file)
@@ -524,7 +524,9 @@ tree_rest_of_compilation (tree fndecl, bool nested_p)
            if (!e->inline_failed)
              cgraph_clone_inlined_nodes (e, true);
        }
-      cfun->saved_tree = save_body (fndecl, &cfun->saved_args);
+      cfun->saved_static_chain_decl = cfun->static_chain_decl;
+      cfun->saved_tree = save_body (fndecl, &cfun->saved_args,
+                                   &cfun->saved_static_chain_decl);
     }
 
   if (flag_inline_trees)
@@ -557,6 +559,7 @@ tree_rest_of_compilation (tree fndecl, bool nested_p)
     {
       DECL_SAVED_TREE (fndecl) = cfun->saved_tree;
       DECL_ARGUMENTS (fndecl) = cfun->saved_args;
+      cfun->static_chain_decl = cfun->saved_static_chain_decl;
 
       /* When not in unit-at-a-time mode, we must preserve out of line copy
         representing node before inlining.  Restore original outgoing edges