From 556e9ba02874fcb3eb1221683327a98c278429c5 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Sat, 3 Jul 2010 01:38:19 +0200 Subject: [PATCH] ipa-split.c (split_function): For aggregate values set return_slot_opt... * ipa-split.c (split_function): For aggregate values set return_slot_opt; when passing DECL_BY_REFERENCE produce * = fncall.part () (execute_split_functions): Do not care about DECL_BY_REFERENCE. From-SVN: r161756 --- gcc/ChangeLog | 10 ++++++++-- gcc/config/i386/i386.c | 2 +- gcc/ipa-split.c | 24 +++++++++++++++--------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4baf61f2624..529d63591c4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-07-02 Jan Hubicka + + * ipa-split.c (split_function): For aggregate values set return_slot_opt; + when passing DECL_BY_REFERENCE produce * = fncall.part () + (execute_split_functions): Do not care about DECL_BY_REFERENCE. + 2010-07-02 Sandra Loosemore * config/arm/neon.md (UNSPEC_VAND): Delete. @@ -60,8 +66,8 @@ 2010-07-02 Jan Hubicka - * ipa-split.c (verify_non_ssa_vars): Break out from ...; perform DFS - walk backwards from entry_bb to check only those basic block of header + * ipa-split.c (verify_non_ssa_vars): Break out from ...; perform DFS walk + backwards from entry_bb to check only those basic block of header that might lead to execution of split part. (consider_split) ... here. (find_return_bb): Allow assignment in return BB. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index ec2cdd38d83..d625ffd8811 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -3558,7 +3558,7 @@ override_options (bool main_args_p) /* Enable sw prefetching at -O3 for CPUS that prefetching is helpful. */ if (flag_prefetch_loop_arrays < 0 && HAVE_prefetch - && optimize >= 3 + && (optimize >= 3 || flag_profile_use) && software_prefetching_beneficial_p ()) flag_prefetch_loop_arrays = 1; diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c index 0cec0b82907..1bd9d248384 100644 --- a/gcc/ipa-split.c +++ b/gcc/ipa-split.c @@ -949,6 +949,13 @@ split_function (struct split_point *split_point) call = gimple_build_call_vec (node->decl, args_to_pass); gimple_set_block (call, DECL_INITIAL (current_function_decl)); + /* We avoid address being taken on any variable used by split part, + so return slot optimization is always possible. Moreover this is + required to make DECL_BY_REFERENCE work. */ + if (aggregate_value_p (DECL_RESULT (current_function_decl), + TREE_TYPE (current_function_decl))) + gimple_call_set_return_slot_opt (call, true); + /* Update return value. This is bit tricky. When we do not return, do nothing. When we return we might need to update return_bb or produce a new return statement. */ @@ -1002,7 +1009,10 @@ split_function (struct split_point *split_point) update_stmt (gsi_stmt (bsi)); } } - gimple_call_set_lhs (call, retval); + if (DECL_BY_REFERENCE (DECL_RESULT (current_function_decl))) + gimple_call_set_lhs (call, build_simple_mem_ref (retval)); + else + gimple_call_set_lhs (call, retval); } gsi_insert_after (&gsi, call, GSI_NEW_STMT); } @@ -1021,7 +1031,10 @@ split_function (struct split_point *split_point) retval = create_tmp_reg (TREE_TYPE (retval), NULL); if (is_gimple_reg (retval)) retval = make_ssa_name (retval, call); - gimple_call_set_lhs (call, retval); + if (DECL_BY_REFERENCE (DECL_RESULT (current_function_decl))) + gimple_call_set_lhs (call, build_simple_mem_ref (retval)); + else + gimple_call_set_lhs (call, retval); } gsi_insert_after (&gsi, call, GSI_NEW_STMT); ret = gimple_build_return (retval); @@ -1085,13 +1098,6 @@ execute_split_functions (void) fprintf (dump_file, "Not splitting: nested function.\n"); return 0; } - /* FIXME: Should be easy to support. */ - if (DECL_BY_REFERENCE (DECL_RESULT (current_function_decl))) - { - if (dump_file) - fprintf (dump_file, "Not splitting: returns value by reference.\n"); - return 0; - } /* See if it makes sense to try to split. It makes sense to split if we inline, that is if we have direct calls to -- 2.30.2