From 60e0af94184fd0ca0a9de35f8abe31f22537b655 Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Mon, 19 Mar 2007 13:36:29 +0000 Subject: [PATCH] re PR tree-optimization/31254 (verify_ssa failed: type mismatch between an SSA_NAME and its symbol) 2007-03-19 Andrew Pinski Richard Guenther PR tree-optimization/31254 * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Use handled_component_p () where appropriate. Continue propagating into the rhs if we propagated into an INDIRECT_REF on the lhs. * gcc.dg/torture/pr31254.c: New testcase. Co-Authored-By: Richard Guenther From-SVN: r123060 --- gcc/ChangeLog | 9 +++++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/torture/pr31254.c | 26 ++++++++++++++++++++++++++ gcc/tree-ssa-forwprop.c | 9 +++------ 4 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr31254.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2e8292db817..16a38b1086f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2007-03-19 Andrew Pinski + Richard Guenther + + PR tree-optimization/31254 + * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): + Use handled_component_p () where appropriate. Continue + propagating into the rhs if we propagated into an INDIRECT_REF + on the lhs. + 2007-03-19 Andreas Krebbel * config/s390/s390.md (op_type attribute): RRR instruction type added. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 78cfd2088f9..b62c6ebe118 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-03-19 Andrew Pinski + Richard Guenther + + PR tree-optimization/31254 + * gcc.dg/torture/pr31254.c: New testcase. + 2007-03-19 Hans-Peter Nilsson * gcc.dg/torture/pr26565.c: Expect warning on packed field for diff --git a/gcc/testsuite/gcc.dg/torture/pr31254.c b/gcc/testsuite/gcc.dg/torture/pr31254.c new file mode 100644 index 00000000000..cec301273e5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr31254.c @@ -0,0 +1,26 @@ +/* { dg-do compile } */ + +struct timespec +{ + long tv_sec; + long tv_nsec; +}; +struct inode +{ + struct timespec i_atime; + struct timespec i_mtime; +}; +struct afs_vnode +{ + struct inode vfs_inode; +}; +static inline + struct inode *AFS_VNODE_TO_I (struct afs_vnode *vnode) +{ + return &vnode->vfs_inode; +}; +afs_inode_map_status (struct afs_vnode *vnode) +{ + struct inode *inode = AFS_VNODE_TO_I (vnode); + inode->i_atime = inode->i_mtime; +} diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index a755a4a4fc3..95a0c91a1de 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -680,7 +680,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, tree use_stmt) /* Strip away any outer COMPONENT_REF/ARRAY_REF nodes from the LHS. ADDR_EXPR will not appear on the LHS. */ lhs = GIMPLE_STMT_OPERAND (use_stmt, 0); - while (TREE_CODE (lhs) == COMPONENT_REF || TREE_CODE (lhs) == ARRAY_REF) + while (handled_component_p (lhs)) lhs = TREE_OPERAND (lhs, 0); rhs = GIMPLE_STMT_OPERAND (use_stmt, 1); @@ -695,9 +695,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, tree use_stmt) fold_stmt_inplace (use_stmt); tidy_after_forward_propagate_addr (use_stmt); - /* The only case we did not replace all uses this way is if the - use statement is of the form *name = name. */ - return rhs != name; + /* Continue propagating into the RHS. */ } /* Trivial case. The use statement could be a trivial copy or a @@ -714,8 +712,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, tree use_stmt) /* Strip away any outer COMPONENT_REF, ARRAY_REF or ADDR_EXPR nodes from the RHS. */ - while (TREE_CODE (rhs) == COMPONENT_REF - || TREE_CODE (rhs) == ARRAY_REF + while (handled_component_p (rhs) || TREE_CODE (rhs) == ADDR_EXPR) rhs = TREE_OPERAND (rhs, 0);