re PR middle-end/38140 (ice for C code with -O2)
PR middle-end/38140 * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): If propagating x = &a into *x = b, add a cast if not useless type conversion or don't optimize if another stmt would be needed. * gcc.dg/pr38140.c: New test. From-SVN: r141949
This commit is contained in:
parent
5ef87778f1
commit
286ba5b307
@ -1,3 +1,11 @@
|
||||
2008-11-17 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/38140
|
||||
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): If
|
||||
propagating x = &a into *x = b, add a cast if not useless
|
||||
type conversion or don't optimize if another stmt would be
|
||||
needed.
|
||||
|
||||
2008-11-17 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
PR middle-end/37908
|
||||
|
@ -1,3 +1,8 @@
|
||||
2008-11-17 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/38140
|
||||
* gcc.dg/pr38140.c: New test.
|
||||
|
||||
2008-11-17 Jack Howarth <howarth@bromo.med.uc.edu>
|
||||
|
||||
PR testsuite/38099
|
||||
|
10
gcc/testsuite/gcc.dg/pr38140.c
Normal file
10
gcc/testsuite/gcc.dg/pr38140.c
Normal file
@ -0,0 +1,10 @@
|
||||
/* PR middle-end/38140 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fno-strict-aliasing" } */
|
||||
|
||||
int foo (void *x)
|
||||
{
|
||||
int (*fn) (int);
|
||||
*(void **)&fn = x;
|
||||
return fn (6);
|
||||
}
|
@ -721,13 +721,28 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
|
||||
&& TREE_OPERAND (lhs, 0) == name
|
||||
&& may_propagate_address_into_dereference (def_rhs, lhs))
|
||||
{
|
||||
*lhsp = unshare_expr (TREE_OPERAND (def_rhs, 0));
|
||||
fold_stmt_inplace (use_stmt);
|
||||
tidy_after_forward_propagate_addr (use_stmt);
|
||||
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);
|
||||
|
||||
/* 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
|
||||
|
Loading…
Reference in New Issue
Block a user