aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2010-07-03 01:38:19 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2010-07-02 23:38:19 +0000
commit556e9ba02874fcb3eb1221683327a98c278429c5 (patch)
tree1913806125a574a453a4f91633b857b230c20a52
parentb3b7bbce43e5189032c565391f2c5c98dedb3f27 (diff)
downloadgcc-556e9ba02874fcb3eb1221683327a98c278429c5.zip
gcc-556e9ba02874fcb3eb1221683327a98c278429c5.tar.gz
gcc-556e9ba02874fcb3eb1221683327a98c278429c5.tar.bz2
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 *<retval> = fncall.part () (execute_split_functions): Do not care about DECL_BY_REFERENCE. From-SVN: r161756
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/i386/i386.c2
-rw-r--r--gcc/ipa-split.c24
3 files changed, 24 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4baf61f..529d635 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-07-02 Jan Hubicka <jh@suse.cz>
+
+ * ipa-split.c (split_function): For aggregate values set return_slot_opt;
+ when passing DECL_BY_REFERENCE produce *<retval> = fncall.part ()
+ (execute_split_functions): Do not care about DECL_BY_REFERENCE.
+
2010-07-02 Sandra Loosemore <sandra@codesourcery.com>
* config/arm/neon.md (UNSPEC_VAND): Delete.
@@ -60,8 +66,8 @@
2010-07-02 Jan Hubicka <jh@suse.cz>
- * 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 ec2cdd3..d625ffd 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 0cec0b8..1bd9d24 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