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:
parent
c6084ae031
commit
4fedf870f5
5 changed files with 51 additions and 8 deletions
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
23
gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c
Normal file
23
gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c
Normal 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" } } */
|
|
@ -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" } } */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue