re PR middle-end/38200 (internal compiler error: in find_func_aliases, at tree-ssa-structalias.c:3905)

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.

From-SVN: r142100
This commit is contained in:
Jakub Jelinek 2008-11-21 22:59:33 +01:00 committed by Jakub Jelinek
parent 0e51e769b5
commit 88e091c337
4 changed files with 38 additions and 22 deletions

View File

@ -1,3 +1,10 @@
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.
2008-11-21 Eric Botcazou <ebotcazou@adacore.com>
* caller-save.c (insert_one_insn): Take into account REG_INC notes

View File

@ -1,3 +1,8 @@
2008-11-21 Jakub Jelinek <jakub@redhat.com>
PR middle-end/38200
* gcc.dg/pr38200.c: New test.
2008-11-21 H.J. Lu <hongjiu.lu@intel.com>
* gcc.target/i386/avx-1.c: Include <immintrin.h> instead of

View File

@ -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;
}

View File

@ -719,30 +719,18 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
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