X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Ftree-inline.h;h=e191105e049d47133535f15643d900c40c97318a;hp=03a2b0a5ddb6596fd832ec9141799d924a5a4491;hb=0664b4250483d9a279da4d63f157c4a3b2e8b966;hpb=b0cdf64212b0111e4fc098a73ba5992bd50a24dc diff --git a/gcc/tree-inline.h b/gcc/tree-inline.h index 03a2b0a5ddb..e191105e049 100644 --- a/gcc/tree-inline.h +++ b/gcc/tree-inline.h @@ -1,5 +1,5 @@ /* Tree inlining hooks and declarations. - Copyright 2001, 2003 Free Software Foundation, Inc. + Copyright 2001, 2003, 2004, 2005 Free Software Foundation, Inc. Contributed by Alexandre Oliva This file is part of GCC. @@ -16,22 +16,135 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +the Free Software Foundation, 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ #ifndef GCC_TREE_INLINE_H #define GCC_TREE_INLINE_H +#include "varray.h" +#include "pointer-set.h" + + +/* Data required for function body duplication. */ + +typedef struct copy_body_data +{ + /* FUNCTION_DECL for function being inlined, or in general the + source function providing the original trees. */ + tree src_fn; + /* FUNCTION_DECL for function being inlined into, or in general + the destination function receiving the new trees. */ + tree dst_fn; + /* Callgraph node of the source function. */ + struct cgraph_node *src_node; + /* Callgraph node of the destination function. */ + struct cgraph_node *dst_node; + /* struct function for function being inlined. Usually this is the same + as DECL_STRUCT_FUNCTION (src_fn), but can be different if saved_cfg + and saved_eh are in use. */ + struct function *src_cfun; + + /* The VAR_DECL for the return value. */ + tree retvar; + /* The map from local declarations in the inlined function to + equivalents in the function into which it is being inlined. */ + struct pointer_map_t *decl_map; + + /* Create a new decl to replace DECL in the destination function. */ + tree (*copy_decl) (tree, struct copy_body_data *); + + /* Current BLOCK. */ + tree block; + + /* Exception region the inlined call lie in. */ + int eh_region; + /* Take region number in the function being copied, add this value and + get eh region number of the duplicate in the function we inline into. */ + int eh_region_offset; + + /* We use the same mechanism do all sorts of different things. Rather + than enumerating the different cases, we categorize the behavior + in the various situations. */ + + /* Indicate the desired behavior wrt call graph edges. We can either + duplicate the edge (inlining, cloning), move the edge (versioning, + parallelization), or move the edges of the clones (saving). */ + enum copy_body_cge_which { + CB_CGE_DUPLICATE, + CB_CGE_MOVE, + CB_CGE_MOVE_CLONES + } transform_call_graph_edges; + + /* True if a new CFG should be created. False for inlining, true for + everything else. */ + bool transform_new_cfg; + + /* True if RETURN_EXPRs should be transformed to just the contained + MODIFY_EXPR. The branch semantics of the return will be handled + by manipulating the CFG rather than a statement. */ + bool transform_return_to_modify; + + /* True if lang_hooks.decls.insert_block should be invoked when + duplicating BLOCK nodes. */ + bool transform_lang_insert_block; + + /* Statements that might be possibly folded. */ + struct pointer_set_t *statements_to_fold; +} copy_body_data; + +/* Weights of constructions for estimate_num_insns. */ + +typedef struct eni_weights_d +{ + /* Cost per call. */ + unsigned call_cost; + + /* Cost of "expensive" div and mod operations. */ + unsigned div_mod_cost; + + /* Cost of switch statement. */ + unsigned switch_cost; + + /* Cost for omp construct. */ + unsigned omp_cost; +} eni_weights; + +/* Weights that estimate_num_insns uses for heuristics in inlining. */ + +extern eni_weights eni_inlining_weights; + +/* Weights that estimate_num_insns uses to estimate the size of the + produced code. */ + +extern eni_weights eni_size_weights; + +/* Weights that estimate_num_insns uses to estimate the time necessary + to execute the produced code. */ + +extern eni_weights eni_time_weights; + /* Function prototypes. */ -void optimize_inline_calls (tree); +extern tree copy_body_r (tree *, int *, void *); +extern void insert_decl_map (copy_body_data *, tree, tree); + +unsigned int optimize_inline_calls (tree); bool tree_inlinable_function_p (tree); -tree walk_tree (tree*, walk_tree_fn, void*, void*); -tree walk_tree_without_duplicates (tree*, walk_tree_fn, void*); -tree copy_tree_r (tree*, int*, void*); -void clone_body (tree, tree, void*); -tree save_body (tree, tree *); -void remap_save_expr (tree*, void*, tree, int*); +tree copy_tree_r (tree *, int *, void *); +void clone_body (tree, tree, void *); +void save_body (tree, tree *, tree *); +int estimate_move_cost (tree type); +void push_cfun (struct function *new_cfun); +void pop_cfun (void); +int estimate_num_insns (tree expr, eni_weights *); +bool tree_versionable_function_p (tree); +void tree_function_versioning (tree, tree, varray_type, bool); + +extern tree remap_decl (tree decl, copy_body_data *id); +extern tree remap_type (tree type, copy_body_data *id); + +extern HOST_WIDE_INT estimated_stack_frame_size (void); /* 0 if we should not perform inlining. 1 if we should expand functions calls inline at the tree level.