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:
parent
fb1f1c3156
commit
892937665d
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue