ipa-split.c (split_function): For aggregate values set return_slot_opt...
authorJan Hubicka <jh@suse.cz>
Fri, 2 Jul 2010 23:38:19 +0000 (01:38 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 2 Jul 2010 23:38:19 +0000 (23:38 +0000)
* 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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/ipa-split.c

index 4baf61f..529d635 100644 (file)
@@ -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.
index ec2cdd3..d625ffd 100644 (file)
@@ -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;
 
index 0cec0b8..1bd9d24 100644 (file)
@@ -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