diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 692e45a83393bd9a2c3fd9e4ed0a3f0bbb103911..3e700b7c9c2ae2b0695fa7924d1509dcbce47197 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-01-11 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/25734 + * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Do not + stop propagation after successful propagation to the LHS. + 2006-01-11 Kazu Hirata <kazu@codesourcery.com> * basic-block.h (control_flow_graph): Change the type of diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7347547b05e7466acf94274eec278b6771e6c953..1160053dd77b734b3d2bd82e6f8f67ae08ff13e4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-01-11 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/25734 + * gcc.dg/tree-ssa/pr25734.c: New testcase. + 2006-01-10 Bernhard Fischer <rep.nop@aon.at> PR fortran/25486 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr25734.c b/gcc/testsuite/gcc.dg/tree-ssa/pr25734.c new file mode 100644 index 0000000000000000000000000000000000000000..a71c7f01a664ce0b1508b6cc199fbf9e3924b9a4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr25734.c @@ -0,0 +1,34 @@ +/* { dg-do compile } */ +/* { dg-options "-Os" } */ + +struct list_head { + struct list_head *next; +}; +static inline __attribute__((always_inline)) void list_del_init(struct +list_head *entry) +{ + __list_del(entry->next); + (entry)->next = (entry); +}; +struct dentry { + void *d_fsdata; +}; +struct sysfs_dirent { + struct list_head s_sibling; + struct list_head s_children; +}; +const char *sysfs_get_name(struct sysfs_dirent *); +void sysfs_hash_and_remove(struct dentry * dir, const char * name) +{ + struct sysfs_dirent * sd; + struct sysfs_dirent * parent_sd = dir->d_fsdata; + for (sd = (struct sysfs_dirent *)((&parent_sd->s_children)->next); + &sd->s_sibling != (&parent_sd->s_children); + sd = (struct sysfs_dirent *)sd->s_sibling.next) { + if (!__builtin_strcmp(sysfs_get_name(sd), name)) + { + list_del_init(&sd->s_sibling); + break; + } + } +} diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index 2f857dc1076c5ebc9bd4e113b8c754e8e8c757af..892edde7a363153260135c2ee8ffed8e64cd4801 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -686,7 +686,6 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt) TREE_OPERAND (lhs, 0) = unshare_expr (TREE_OPERAND (stmt, 1)); fold_stmt_inplace (use_stmt); tidy_after_forward_propagate_addr (use_stmt); - return true; } /* Trivial case. The use statement could be a trivial copy. We @@ -696,7 +695,7 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt) we can catch some cascading effects, ie the single use is in a copy, and the copy is used later by a single INDIRECT_REF for example. */ - if (TREE_CODE (lhs) == SSA_NAME && TREE_OPERAND (use_stmt, 1) == name) + else if (TREE_CODE (lhs) == SSA_NAME && TREE_OPERAND (use_stmt, 1) == name) { TREE_OPERAND (use_stmt, 1) = unshare_expr (TREE_OPERAND (stmt, 1)); tidy_after_forward_propagate_addr (use_stmt);