aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-01-31 19:54:32 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-01-31 19:54:32 +0000
commit44f89620d9ecac3995e3cb7484221ce83f44a2b0 (patch)
treefe492fd940655194debccd895f6aa03c14543b56 /gcc
parent747b0aedad6db1b30c7d7f6051aa7624947e3611 (diff)
downloadgcc-44f89620d9ecac3995e3cb7484221ce83f44a2b0.zip
gcc-44f89620d9ecac3995e3cb7484221ce83f44a2b0.tar.gz
gcc-44f89620d9ecac3995e3cb7484221ce83f44a2b0.tar.bz2
tree-sra.c (ptr_parm_has_direct_uses): Rewrite to be conservatively correct.
2010-01-31 Richard Guenther <rguenther@suse.de> * tree-sra.c (ptr_parm_has_direct_uses): Rewrite to be conservatively correct. From-SVN: r156413
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/tree-sra.c59
2 files changed, 39 insertions, 25 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 54ed530..366652c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2010-01-31 Richard Guenther <rguenther@suse.de>
+
+ * tree-sra.c (ptr_parm_has_direct_uses): Rewrite to be
+ conservatively correct.
+
2010-01-31 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR target/42850
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 7c3373d..c0d3d3f 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -2904,42 +2904,51 @@ ptr_parm_has_direct_uses (tree parm)
FOR_EACH_IMM_USE_STMT (stmt, ui, name)
{
- if (gimple_assign_single_p (stmt))
+ int uses_ok = 0;
+ use_operand_p use_p;
+
+ if (is_gimple_debug (stmt))
+ continue;
+
+ /* Valid uses include dereferences on the lhs and the rhs. */
+ if (gimple_has_lhs (stmt))
{
- tree rhs = gimple_assign_rhs1 (stmt);
- if (rhs == name)
- ret = true;
- else if (TREE_CODE (rhs) == ADDR_EXPR)
- {
- do
- {
- rhs = TREE_OPERAND (rhs, 0);
- }
- while (handled_component_p (rhs));
- if (INDIRECT_REF_P (rhs) && TREE_OPERAND (rhs, 0) == name)
- ret = true;
- }
+ tree lhs = gimple_get_lhs (stmt);
+ while (handled_component_p (lhs))
+ lhs = TREE_OPERAND (lhs, 0);
+ if (INDIRECT_REF_P (lhs)
+ && TREE_OPERAND (lhs, 0) == name)
+ uses_ok++;
}
- else if (gimple_code (stmt) == GIMPLE_RETURN)
+ if (gimple_assign_single_p (stmt))
{
- tree t = gimple_return_retval (stmt);
- if (t == name)
- ret = true;
+ tree rhs = gimple_assign_rhs1 (stmt);
+ while (handled_component_p (rhs))
+ rhs = TREE_OPERAND (rhs, 0);
+ if (INDIRECT_REF_P (rhs)
+ && TREE_OPERAND (rhs, 0) == name)
+ uses_ok++;
}
else if (is_gimple_call (stmt))
{
unsigned i;
- for (i = 0; i < gimple_call_num_args (stmt); i++)
+ for (i = 0; i < gimple_call_num_args (stmt); ++i)
{
tree arg = gimple_call_arg (stmt, i);
- if (arg == name)
- {
- ret = true;
- break;
- }
+ while (handled_component_p (arg))
+ arg = TREE_OPERAND (arg, 0);
+ if (INDIRECT_REF_P (arg)
+ && TREE_OPERAND (arg, 0) == name)
+ uses_ok++;
}
}
- else if (!is_gimple_debug (stmt))
+
+ /* If the number of valid uses does not match the number of
+ uses in this stmt there is an unhandled use. */
+ FOR_EACH_IMM_USE_ON_STMT (use_p, ui)
+ --uses_ok;
+
+ if (uses_ok != 0)
ret = true;
if (ret)