diff options
Diffstat (limited to 'gcc/cp/optimize.c')
-rw-r--r-- | gcc/cp/optimize.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c index a91f8d5f564..ed43b435831 100644 --- a/gcc/cp/optimize.c +++ b/gcc/cp/optimize.c @@ -1,5 +1,5 @@ /* Perform optimizations on tree structure. - Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2007 + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2007, 2008 Free Software Foundation, Inc. Written by Mark Michell (mark@codesourcery.com). @@ -40,7 +40,7 @@ along with GCC; see the file COPYING3. If not see #include "langhooks.h" #include "diagnostic.h" #include "tree-dump.h" -#include "tree-gimple.h" +#include "gimple.h" /* Prototypes. */ @@ -72,35 +72,40 @@ update_cloned_parm (tree parm, tree cloned_parm, bool first) DECL_GIMPLE_REG_P (cloned_parm) = DECL_GIMPLE_REG_P (parm); } -/* FN is a function that has a complete body, and CLONE is a function whose - body is to be set to a copy of FN, mapping argument declarations according - to the ARG_MAP splay_tree. */ + +/* FN is a function in High GIMPLE form that has a complete body and no + CFG. CLONE is a function whose body is to be set to a copy of FN, + mapping argument declarations according to the ARG_MAP splay_tree. */ static void clone_body (tree clone, tree fn, void *arg_map) { copy_body_data id; + gimple_seq new_body; + + /* FN must already be in GIMPLE form. */ + gcc_assert (gimple_body (fn)); - /* Clone the body, as if we were making an inline call. But, remap the - parameters in the callee to the parameters of caller. */ + /* Clone the body, as if we were making an inline call. But, remap + the parameters in the callee to the parameters of caller. */ memset (&id, 0, sizeof (id)); id.src_fn = fn; id.dst_fn = clone; id.src_cfun = DECL_STRUCT_FUNCTION (fn); - id.decl_map = (struct pointer_map_t *)arg_map; + id.decl_map = (struct pointer_map_t *) arg_map; id.copy_decl = copy_decl_no_change; id.transform_call_graph_edges = CB_CGE_DUPLICATE; id.transform_new_cfg = true; id.transform_return_to_modify = false; - id.transform_lang_insert_block = insert_block; + id.transform_lang_insert_block = NULL; /* We're not inside any EH region. */ id.eh_region = -1; /* Actually copy the body. */ - append_to_statement_list_force (copy_generic_body (&id), - &DECL_SAVED_TREE (clone)); + new_body = remap_gimple_seq (gimple_body (fn), &id); + gimple_set_body (clone, new_body); } /* FN is a function that has a complete body. Clone the body as @@ -228,6 +233,7 @@ maybe_clone_body (tree fn) /* Now, expand this function into RTL, if appropriate. */ finish_function (0); BLOCK_ABSTRACT_ORIGIN (DECL_INITIAL (clone)) = DECL_INITIAL (fn); + DECL_SAVED_TREE (clone) = NULL; expand_or_defer_fn (clone); first = false; } |