mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-22 15:00:55 +08:00
re PR tree-optimization/15077 (ICE in make_decl_rtl when inlining tail recursive nested function)
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
This commit is contained in:
parent
e847cc68eb
commit
1a837f7746
@ -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.
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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. */
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user