diff options
author | Richard Guenther <rguenther@suse.de> | 2010-01-31 19:54:32 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-01-31 19:54:32 +0000 |
commit | 44f89620d9ecac3995e3cb7484221ce83f44a2b0 (patch) | |
tree | fe492fd940655194debccd895f6aa03c14543b56 /gcc | |
parent | 747b0aedad6db1b30c7d7f6051aa7624947e3611 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/tree-sra.c | 59 |
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) |