re PR tree-optimization/21031 (Another missed forward propagation opportunity)

gcc/
	PR tree-optimization/21031
	* tree-ssa-forwprop.c (ssa_name_defined_by_comparison_p): New.
	(forward_propagate_into_cond_1): Call it.  Forward propagate
	integer-integer casts into COND_EXPRs.

testsuite/
	PR tree-optimization/21031
	* gcc.dg/tree-ssa/pr21031.c: New.

From-SVN: r98199
This commit is contained in:
Kazu Hirata 2005-04-15 18:42:38 +00:00 committed by Kazu Hirata
parent 6ba40dd7ac
commit 9f1054af04
4 changed files with 55 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2005-04-15 Kazu Hirata <kazu@cs.umass.edu>
PR tree-optimization/21031
* tree-ssa-forwprop.c (ssa_name_defined_by_comparison_p): New.
(forward_propagate_into_cond_1): Call it. Forward propagate
integer-integer casts into COND_EXPRs.
2005-04-15 Dave Korn <dave.korn@artimi.com>
* gcc.c (default_compilers): Clarify obscure error message when

View File

@ -1,3 +1,8 @@
2005-04-15 Kazu Hirata <kazu@cs.umass.edu>
PR tree-optimization/21031
* gcc.dg/tree-ssa/pr21031.c: New.
2005-04-15 Uros Bizjak <uros@kss-loka.si>
PR tree-optimization/21004

View File

@ -0,0 +1,20 @@
/* PR tree-optimization/21031
Make sure that a != 0 is propagated into the "if" statement. */
/* { dg-do compile } */
/* { dg-options "-O1 -fdump-tree-forwprop1-details" } */
int
foo (int a)
{
int b = a != 0;
unsigned char c = b;
if (c)
return 1;
else
return 0;
}
/* { dg-final { scan-tree-dump-times "Replaced" 2 "forwprop1"} } */
/* { dg-final { cleanup-tree-dump "forwprop1" } } */

View File

@ -109,6 +109,23 @@ Boston, MA 02111-1307, USA. */
This will (of course) be extended as other needs arise. */
/* Given an SSA_NAME VAR, return true if and only if VAR is defined by
a comparison. */
static bool
ssa_name_defined_by_comparison_p (tree var)
{
tree def = SSA_NAME_DEF_STMT (var);
if (TREE_CODE (def) == MODIFY_EXPR)
{
tree rhs = TREE_OPERAND (def, 1);
return COMPARISON_CLASS_P (rhs);
}
return 0;
}
/* Forward propagate a single-use variable into COND once. Return a
new condition if successful. Return NULL_TREE otherwise. */
@ -303,6 +320,12 @@ forward_propagate_into_cond_1 (tree cond, tree *test_var_p)
|| (TREE_CODE (inner_type) == BOOLEAN_TYPE
&& INTEGRAL_TYPE_P (outer_type)))
;
else if (INTEGRAL_TYPE_P (outer_type)
&& INTEGRAL_TYPE_P (inner_type)
&& TREE_CODE (TREE_OPERAND (def_rhs, 0)) == SSA_NAME
&& ssa_name_defined_by_comparison_p (TREE_OPERAND (def_rhs,
0)))
;
else
return NULL_TREE;