aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2008-07-07 15:11:29 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2008-07-07 15:11:29 +0000
commit115340c79fdd40c3b8c809ef81a1deebec0a2500 (patch)
treeafd0ad862ac893fe8d11c0aaafd31d7e4f0e6d42 /gcc
parent511e41e54d2f5bd036740518781e126ecccbad49 (diff)
downloadgcc-115340c79fdd40c3b8c809ef81a1deebec0a2500.zip
gcc-115340c79fdd40c3b8c809ef81a1deebec0a2500.tar.gz
gcc-115340c79fdd40c3b8c809ef81a1deebec0a2500.tar.bz2
re PR target/36713 (r137252 breaks -O2 optimization on x86_64-unknown-linux-gnu)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/tree-flow-inline.h10
-rw-r--r--gcc/tree-nrv.c2
-rw-r--r--gcc/tree-outof-ssa.c2
-rw-r--r--gcc/tree-tailcall.c4
5 files changed, 22 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2bf1fd6..41b494d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/tree-flow-inline.h b/gcc/tree-flow-inline.h
index bff697d..19a3002 100644
--- a/gcc/tree-flow-inline.h
+++ b/gcc/tree-flow-inline.h
@@ -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)
{
diff --git a/gcc/tree-nrv.c b/gcc/tree-nrv.c
index 13febca..cdf6c3f 100644
--- a/gcc/tree-nrv.c
+++ b/gcc/tree-nrv.c
@@ -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;
diff --git a/gcc/tree-outof-ssa.c b/gcc/tree-outof-ssa.c
index 40c1d3f..21f362b 100644
--- a/gcc/tree-outof-ssa.c
+++ b/gcc/tree-outof-ssa.c
@@ -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;
}
diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c
index 09a2eaf..92127b4 100644
--- a/gcc/tree-tailcall.c
+++ b/gcc/tree-tailcall.c
@@ -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;
}