tree-ssa-forwprop.c (forward_propagate_addr_expr_1): More properly handle conversion/copy chains after tuplification.

2008-08-20  Richard Guenther  <rguenther@suse.de>

	* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): More
	properly handle conversion/copy chains after tuplification.

	* gcc.dg/tree-ssa/forwprop-9.c: Scan FRE dump as well.
	* gcc.dg/tree-ssa/forwprop-10.c: New testcase.

From-SVN: r139288
This commit is contained in:
Richard Guenther 2008-08-20 13:21:41 +00:00 committed by Richard Biener
parent c6084ae031
commit 4fedf870f5
5 changed files with 51 additions and 8 deletions

View file

@ -1,3 +1,8 @@
2008-08-20 Richard Guenther <rguenther@suse.de>
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): More
properly handle conversion/copy chains after tuplification.
2008-08-20 Richard Guenther <rguenther@suse.de>
* passes.c (init_optimization_passes): Move the second

View file

@ -1,3 +1,8 @@
2008-08-20 Richard Guenther <rguenther@suse.de>
* gcc.dg/tree-ssa/forwprop-9.c: Scan FRE dump as well.
* gcc.dg/tree-ssa/forwprop-10.c: New testcase.
2008-08-20 Richard Guenther <rguenther@suse.de>
* gcc.dg/tree-ssa/20030530-2.c: Scan dom2 dump.

View file

@ -0,0 +1,23 @@
/* { dg-do compile } */
/* { dg-options "-O -fdump-tree-forwprop1" } */
int b;
unsigned a;
static inline int *g(void)
{
a = 1;
return (int*)&a;
}
void test2(void)
{
b = *g();
}
/* The indirect load should be replaced by a load from a and a
conversion to int. */
/* { dg-final { scan-tree-dump "= a;" "forwprop1" } } */
/* { dg-final { scan-tree-dump "= \\\(int\\\) " "forwprop1" } } */
/* { dg-final { scan-tree-dump-not "= \\\*" "forwprop1" } } */
/* { dg-final { cleanup-tree-dump "forwprop1" } } */

View file

@ -1,6 +1,5 @@
/* { dg-do compile } */
/* { dg-options "-O1 -fdump-tree-final_cleanup -W -Wall -fno-early-inlining" } */
/* { dg-options "-O1 -fdump-tree-final_cleanup -fdump-tree-fre -W -Wall -fno-early-inlining" } */
int b;
unsigned a;
@ -13,6 +12,10 @@ void f(void)
{
b = *g();
}
/* We should have converted the assignments to two = 1. */
/* We should have converted the assignments to two = 1. FRE does this. */
/* { dg-final { scan-tree-dump-times " = 1" 2 "final_cleanup"} } */
/* { dg-final { scan-tree-dump-not " = a;" "fre"} } */
/* { dg-final { cleanup-tree-dump "fre" } } */
/* { dg-final { cleanup-tree-dump "final_cleanup" } } */

View file

@ -689,15 +689,22 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
a conversion to def_rhs type separate, though. */
if (TREE_CODE (lhs) == SSA_NAME
&& ((rhs_code == SSA_NAME && rhs == name)
|| CONVERT_EXPR_CODE_P (rhs_code))
&& useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (def_rhs)))
|| CONVERT_EXPR_CODE_P (rhs_code)))
{
/* Only recurse if we don't deal with a single use. */
if (!single_use_p)
/* Only recurse if we don't deal with a single use or we cannot
do the propagation to the current statement. In particular
we can end up with a conversion needed for a non-invariant
address which we cannot do in a single statement. */
if (!single_use_p
|| (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (def_rhs))
&& !is_gimple_min_invariant (def_rhs)))
return forward_propagate_addr_expr (lhs, def_rhs);
gimple_assign_set_rhs1 (use_stmt, unshare_expr (def_rhs));
gimple_assign_set_rhs_code (use_stmt, TREE_CODE (def_rhs));
if (useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (def_rhs)))
gimple_assign_set_rhs_code (use_stmt, TREE_CODE (def_rhs));
else
gimple_assign_set_rhs_code (use_stmt, NOP_EXPR);
return true;
}