re PR target/36713 (r137252 breaks -O2 optimization on x86_64-unknown-linux-gnu)
authorRichard Guenther <rguenther@suse.de>
Mon, 7 Jul 2008 15:11:29 +0000 (15:11 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 7 Jul 2008 15:11:29 +0000 (15:11 +0000)
2008-07-07  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/36713
* tree-flow-inline.h (is_call_used): New function.
* tree-nrv.c (dest_safe_for_nrv_p): Use it.
* tree-tailcall.c (suitable_for_tail_opt_p): Likewise.
* tree-outof-ssa.c (create_temp): Set call-used flag if required.

From-SVN: r137571

gcc/ChangeLog
gcc/tree-flow-inline.h
gcc/tree-nrv.c
gcc/tree-outof-ssa.c
gcc/tree-tailcall.c

index 2bf1fd6e5107925c686b7e18eef6b79aab242bbd..41b494dee92d996f5e0a896c5aed9e34f250fa9f 100644 (file)
@@ -1,3 +1,11 @@
+2008-07-07  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/36713
+       * tree-flow-inline.h (is_call_used): New function.
+       * tree-nrv.c (dest_safe_for_nrv_p): Use it.
+       * tree-tailcall.c (suitable_for_tail_opt_p): Likewise.
+       * tree-outof-ssa.c (create_temp): Set call-used flag if required.
+
 2008-07-07  Maxim Kuvyrkov  <maxim@codesourcery.com>
 
        * config/m68k/m68k.c (m68k_return_in_memory): Fix arguments types.
index bff697db5ae089a9478a1756f10ea0b9950dfc69..19a3002dfda33c5c9a1d1f6028ffdb4db264094c 100644 (file)
@@ -881,7 +881,15 @@ factoring_name_p (const_tree name)
   return TREE_CODE (SSA_NAME_VAR (name)) == MEMORY_PARTITION_TAG;
 }
 
-/* Return true if VAR is a clobbered by function calls.  */
+/* Return true if VAR is used by function calls.  */
+static inline bool
+is_call_used (const_tree var)
+{
+  return (var_ann (var)->call_clobbered
+         || bitmap_bit_p (gimple_call_used_vars (cfun), DECL_UID (var)));
+}
+
+/* Return true if VAR is clobbered by function calls.  */
 static inline bool
 is_call_clobbered (const_tree var)
 {
index 13febcaf79ba5e12f70ac304f9df7484fb5afd99..cdf6c3fd9e6081f2f3ddfa31c7d2928ff8ffaa3d 100644 (file)
@@ -265,7 +265,7 @@ dest_safe_for_nrv_p (tree dest)
   if (TREE_CODE (dest) == SSA_NAME)
     dest = SSA_NAME_VAR (dest);
 
-  if (is_call_clobbered (dest))
+  if (is_call_used (dest))
     return false;
 
   return true;
index 40c1d3f9c3bb9de2fb3b62ad79d1729acee8520a..21f362b9059ce68b52a8e98a7209463c01fb0d3c 100644 (file)
@@ -128,6 +128,8 @@ create_temp (tree t)
   set_symbol_mem_tag (tmp, symbol_mem_tag (t));
   if (is_call_clobbered (t))
     mark_call_clobbered (tmp, var_ann (t)->escape_mask);
+  if (bitmap_bit_p (gimple_call_used_vars (cfun), DECL_UID (t)))
+    bitmap_set_bit (gimple_call_used_vars (cfun), DECL_UID (tmp));
 
   return tmp;
 }
index 09a2eafe11939ac59b2fcb4d6d71db00b24bc811..92127b4b7afcfdf453a0fc5e67017c1a5df6bb94 100644 (file)
@@ -138,14 +138,14 @@ suitable_for_tail_opt_p (void)
   if (cfun->stdarg)
     return false;
 
-  /* No local variable nor structure field should be call-clobbered.  We
+  /* No local variable nor structure field should be call-used.  We
      ignore any kind of memory tag, as these are not real variables.  */
 
   FOR_EACH_REFERENCED_VAR (var, rvi)
     {
       if (!is_global_var (var)
          && !MTAG_P (var)
-         && (gimple_aliases_computed_p (cfun) ? is_call_clobbered (var)
+         && (gimple_aliases_computed_p (cfun)? is_call_used (var)
              : TREE_ADDRESSABLE (var)))
        return false;
     }