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: r147703
This commit is contained in:
Richard Guenther 2009-05-19 11:54:16 +00:00 committed by Richard Biener
parent fb1f1c3156
commit 892937665d
4 changed files with 42 additions and 14 deletions

View File

@ -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-18 Dodji Seketeli <dodji@redhat.com>
PR debug/40109

View File

@ -1,3 +1,7 @@
2009-05-19 Richard Guenther <rguenther@suse.de>
* gcc.c-torture/compile/20090519-1.c: New testcase.
2009-05-18 Dodji Seketeli <dodji@redhat.com>
PR debug/40109

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

View File

@ -683,6 +683,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);
@ -726,19 +727,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
@ -758,7 +766,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,
@ -789,7 +797,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. */
@ -803,7 +811,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;
}
}