[PATCH] Fix tree forwprop a second time (PR middle-end/38200)
Richard Guenther
richard.guenther@gmail.com
Fri Nov 21 16:11:00 GMT 2008
On Fri, Nov 21, 2008 at 3:40 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> My earlier patch to forward_propagate_addr_expr_1 contained a thinko,
> as for x = &a; *x = b; replacement with a = b; we know a's address
> has been taken, so a = (a's type) b; is invalid GIMPLE (a = b;
> generated previously was also invalid GIMPLE if the type conversion
> wasn't useless). The following patch thus never adds a cast,
> just checks if the conversion is useless. For
> x = &a;
> x->j = b;
> transforming it to
> a.j = b;
> doesn't change LHS nor RHS side, so this checking isn't needed.
>
> Ok if bootstrap+regtest succeeds on x86_64-linux?
Ok.
Thanks,
Richard.
> 2008-11-21 Jakub Jelinek <jakub@redhat.com>
>
> PR middle-end/38200
> * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Only
> propagate x = &a into *x = b if conversion from b to a's type is
> useless.
>
> * gcc.dg/pr38200.c: New test.
>
> --- gcc/tree-ssa-forwprop.c.jj 2008-11-18 19:24:09.000000000 +0100
> +++ gcc/tree-ssa-forwprop.c 2008-11-21 15:19:55.000000000 +0100
> @@ -719,30 +719,18 @@ forward_propagate_addr_expr_1 (tree name
> propagate the ADDR_EXPR into the use of NAME and fold the result. */
> if (TREE_CODE (lhs) == INDIRECT_REF
> && TREE_OPERAND (lhs, 0) == name
> - && may_propagate_address_into_dereference (def_rhs, lhs))
> + && may_propagate_address_into_dereference (def_rhs, lhs)
> + && (lhsp != gimple_assign_lhs_ptr (use_stmt)
> + || useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (def_rhs, 0)),
> + TREE_TYPE (rhs))))
> - bool valid = true;
> - if (lhsp == gimple_assign_lhs_ptr (use_stmt)
> - && !useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (def_rhs, 0)),
> - TREE_TYPE (rhs))
> - && !CONVERT_EXPR_CODE_P (rhs_code))
> - {
> - if (rhs_code == SSA_NAME)
> - gimple_assign_set_rhs_code (use_stmt, NOP_EXPR);
> - else
> - valid = false;
> - }
> - if (valid)
> - {
> - *lhsp = unshare_expr (TREE_OPERAND (def_rhs, 0));
> - fold_stmt_inplace (use_stmt);
> - tidy_after_forward_propagate_addr (use_stmt);
> + *lhsp = unshare_expr (TREE_OPERAND (def_rhs, 0));
> + fold_stmt_inplace (use_stmt);
> + tidy_after_forward_propagate_addr (use_stmt);
>
> - /* Continue propagating into the RHS if this was not the only
> - use. */
> - if (single_use_p)
> - return true;
> - }
> + /* Continue propagating into the RHS if this was not the only use. */
> + if (single_use_p)
> + return true;
> }
>
> /* Strip away any outer COMPONENT_REF, ARRAY_REF or ADDR_EXPR
> --- gcc/testsuite/gcc.dg/pr38200.c.jj 2008-11-21 15:21:52.000000000 +0100
> +++ gcc/testsuite/gcc.dg/pr38200.c 2008-11-21 15:07:25.000000000 +0100
> @@ -0,0 +1,16 @@
> +/* PR middle-end/38200 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fno-strict-aliasing" } */
> +
> +typedef int (*callptr) (void);
> +int foo (void **x);
> +void foo2 (callptr *);
> +int (*foo_ptr) (void **x) = foo;
> +
> +void
> +bar (void)
> +{
> + void *ptr;
> + foo2 ((callptr *) &ptr);
> + *(void **) &foo_ptr = ptr;
> +}
>
> Jakub
>
More information about the Gcc-patches
mailing list