diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2012-01-11 18:47:28 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2012-01-11 18:47:28 +0000 |
commit | 1a2c27e964bb00e2ddbe3e1a265c95adb851402c (patch) | |
tree | f3e48a68df89c7419d086f7a678f0af82c975f18 /gcc/tree-inline.c | |
parent | b2e25729e5a4b93e4c022815f19a43e4ae01f11e (diff) | |
download | gcc-1a2c27e964bb00e2ddbe3e1a265c95adb851402c.zip gcc-1a2c27e964bb00e2ddbe3e1a265c95adb851402c.tar.gz gcc-1a2c27e964bb00e2ddbe3e1a265c95adb851402c.tar.bz2 |
tree.h (build_function_decl_skip_args): Add boolean parameter.
* tree.h (build_function_decl_skip_args): Add boolean parameter.
(build_function_type_skip_args): Delete.
* tree.c (build_function_type_skip_args): Make static and add
SKIP_RETURN parameter. Fix thinko in the handling of variants.
(build_function_decl_skip_args): Add SKIP_RETURN parameter and
pass it to build_function_type_skip_args.
* cgraph.h (cgraph_function_versioning): Add boolean parameter.
(tree_function_versioning): Likewise.
* cgraph.c (cgraph_create_virtual_clone): Adjust call to
build_function_decl_skip_args.
* cgraphunit.c (cgraph_function_versioning): Add SKIP_RETURN parameter
and pass it to build_function_decl_skip_args/tree_function_versioning.
(cgraph_materialize_clone): Adjust call to tree_function_versioning.
* ipa-inline-transform.c (save_inline_function_body): Likewise.
* trans-mem.c (ipa_tm_create_version): Likewise.
* tree-sra.c (modify_function): Ditto for cgraph_function_versioning.
* tree-inline.c (declare_return_variable): Remove always-true test.
(tree_function_versioning): Add SKIP_RETURN parameter. If the function
returns non-void and SKIP_RETURN, create a void-typed RESULT_DECL.
* ipa-split.c (split_function): Skip the return value for the split
part if it doesn't return.
From-SVN: r183102
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index c6ae65e..a039890 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -2809,9 +2809,8 @@ declare_return_variable (copy_body_data *id, tree return_slot, tree modify_dest, else caller_type = TREE_TYPE (TREE_TYPE (callee)); - /* We don't need to do anything for functions that don't return - anything. */ - if (!result || VOID_TYPE_P (callee_type)) + /* We don't need to do anything for functions that don't return anything. */ + if (VOID_TYPE_P (callee_type)) return NULL_TREE; /* If there was a return slot, then the return value is the @@ -5040,6 +5039,7 @@ update_clone_info (copy_body_data * id) If non-NULL ARGS_TO_SKIP determine function parameters to remove from new version. + If SKIP_RETURN is true, the new version will return void. If non-NULL BLOCK_TO_COPY determine what basic blocks to copy. If non_NULL NEW_ENTRY determine new entry BB of the clone. */ @@ -5047,7 +5047,8 @@ void tree_function_versioning (tree old_decl, tree new_decl, VEC(ipa_replace_map_p,gc)* tree_map, bool update_clones, bitmap args_to_skip, - bitmap blocks_to_copy, basic_block new_entry) + bool skip_return, bitmap blocks_to_copy, + basic_block new_entry) { struct cgraph_node *old_version_node; struct cgraph_node *new_version_node; @@ -5200,7 +5201,18 @@ tree_function_versioning (tree old_decl, tree new_decl, /* Add local vars. */ add_local_variables (DECL_STRUCT_FUNCTION (old_decl), cfun, &id, false); - if (DECL_RESULT (old_decl) != NULL_TREE) + if (VOID_TYPE_P (TREE_TYPE (DECL_RESULT (old_decl)))) + ; + else if (skip_return) + { + DECL_RESULT (new_decl) + = build_decl (DECL_SOURCE_LOCATION (DECL_RESULT (old_decl)), + RESULT_DECL, NULL_TREE, void_type_node); + DECL_CONTEXT (DECL_RESULT (new_decl)) = new_decl; + cfun->returns_struct = 0; + cfun->returns_pcc_struct = 0; + } + else { tree old_name; DECL_RESULT (new_decl) = remap_decl (DECL_RESULT (old_decl), &id); |