tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Do not falsely claim to have propagated into all uses.
2009-05-19 Richard Guenther <rguenther@suse.de> * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Do not falsely claim to have propagated into all uses. * gcc.c-torture/compile/20090519-1.c: New testcase. From-SVN: r147702
This commit is contained in:
parent
7859dde7ee
commit
377f099ab8
4 changed files with 42 additions and 14 deletions
|
@ -1,3 +1,8 @@
|
|||
2009-05-19 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Do
|
||||
not falsely claim to have propagated into all uses.
|
||||
|
||||
2009-05-19 Ben Elliston <bje@au.ibm.com>
|
||||
|
||||
* doc/invoke.texi (C Dialect Options): Update OpenMP specification
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2009-05-19 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
* gcc.c-torture/compile/20090519-1.c: New testcase.
|
||||
|
||||
2009-05-18 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* g++.dg/cpp0x/explicit1.C: New.
|
||||
|
|
11
gcc/testsuite/gcc.c-torture/compile/20090519-1.c
Normal file
11
gcc/testsuite/gcc.c-torture/compile/20090519-1.c
Normal file
|
@ -0,0 +1,11 @@
|
|||
typedef struct { int licensed; } __pmPDUInfo;
|
||||
void __pmDecodeXtendError (int *);
|
||||
void do_handshake(void)
|
||||
{
|
||||
__pmPDUInfo *pduinfo;
|
||||
int challenge;
|
||||
__pmDecodeXtendError(&challenge);
|
||||
pduinfo = (__pmPDUInfo *)&challenge;
|
||||
*pduinfo = *pduinfo;
|
||||
}
|
||||
|
|
@ -717,6 +717,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
|
|||
tree *rhsp, *lhsp;
|
||||
gimple use_stmt = gsi_stmt (*use_stmt_gsi);
|
||||
enum tree_code rhs_code;
|
||||
bool res = true;
|
||||
|
||||
gcc_assert (TREE_CODE (def_rhs) == ADDR_EXPR);
|
||||
|
||||
|
@ -764,19 +765,26 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
|
|||
/* Now see if the LHS node is an INDIRECT_REF using NAME. If so,
|
||||
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)
|
||||
&& (lhsp != gimple_assign_lhs_ptr (use_stmt)
|
||||
|| useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (def_rhs, 0)),
|
||||
TREE_TYPE (rhs))))
|
||||
&& TREE_OPERAND (lhs, 0) == name)
|
||||
{
|
||||
*lhsp = unshare_expr (TREE_OPERAND (def_rhs, 0));
|
||||
fold_stmt_inplace (use_stmt);
|
||||
tidy_after_forward_propagate_addr (use_stmt);
|
||||
if (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))))
|
||||
{
|
||||
*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;
|
||||
}
|
||||
else
|
||||
/* We can have a struct assignment dereferencing our name twice.
|
||||
Note that we didn't propagate into the lhs to not falsely
|
||||
claim we did when propagating into the rhs. */
|
||||
res = false;
|
||||
}
|
||||
|
||||
/* Strip away any outer COMPONENT_REF, ARRAY_REF or ADDR_EXPR
|
||||
|
@ -796,7 +804,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
|
|||
*rhsp = unshare_expr (TREE_OPERAND (def_rhs, 0));
|
||||
fold_stmt_inplace (use_stmt);
|
||||
tidy_after_forward_propagate_addr (use_stmt);
|
||||
return true;
|
||||
return res;
|
||||
}
|
||||
|
||||
/* Now see if the RHS node is an INDIRECT_REF using NAME. If so,
|
||||
|
@ -827,7 +835,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
|
|||
true, GSI_NEW_STMT);
|
||||
gimple_assign_set_rhs1 (use_stmt, new_rhs);
|
||||
tidy_after_forward_propagate_addr (use_stmt);
|
||||
return true;
|
||||
return res;
|
||||
}
|
||||
/* If the defining rhs comes from an indirect reference, then do not
|
||||
convert into a VIEW_CONVERT_EXPR. */
|
||||
|
@ -841,7 +849,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
|
|||
*rhsp = new_rhs;
|
||||
fold_stmt_inplace (use_stmt);
|
||||
tidy_after_forward_propagate_addr (use_stmt);
|
||||
return true;
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue