Commit 4fedf870 by Richard Guenther Committed by Richard Biener

tree-ssa-forwprop.c (forward_propagate_addr_expr_1): More properly handle…

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
parent c6084ae0
2008-08-20 Richard Guenther <rguenther@suse.de> 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 * passes.c (init_optimization_passes): Move the second
forwprop pass before alias computation. Remove the second forwprop pass before alias computation. Remove the second
DCE pass. Remove the first dominator and phi copy/const DCE pass. Remove the first dominator and phi copy/const
......
2008-08-20 Richard Guenther <rguenther@suse.de> 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. * gcc.dg/tree-ssa/20030530-2.c: Scan dom2 dump.
* gcc.dg/tree-ssa/20030611-1.c: Likewise. * gcc.dg/tree-ssa/20030611-1.c: Likewise.
* gcc.dg/tree-ssa/20030703-1.c: Likewise. * gcc.dg/tree-ssa/20030703-1.c: Likewise.
......
/* { 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" } } */
/* { dg-do compile } */ /* { 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; int b;
unsigned a; unsigned a;
...@@ -13,6 +12,10 @@ void f(void) ...@@ -13,6 +12,10 @@ void f(void)
{ {
b = *g(); 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-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" } } */ /* { dg-final { cleanup-tree-dump "final_cleanup" } } */
...@@ -689,15 +689,22 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, ...@@ -689,15 +689,22 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
a conversion to def_rhs type separate, though. */ a conversion to def_rhs type separate, though. */
if (TREE_CODE (lhs) == SSA_NAME if (TREE_CODE (lhs) == SSA_NAME
&& ((rhs_code == SSA_NAME && rhs == name) && ((rhs_code == SSA_NAME && rhs == name)
|| CONVERT_EXPR_CODE_P (rhs_code)) || CONVERT_EXPR_CODE_P (rhs_code)))
&& useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (def_rhs)))
{ {
/* Only recurse if we don't deal with a single use. */ /* Only recurse if we don't deal with a single use or we cannot
if (!single_use_p) 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); return forward_propagate_addr_expr (lhs, def_rhs);
gimple_assign_set_rhs1 (use_stmt, unshare_expr (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; return true;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment