re PR tree-optimization/61452 (hang at -O1 and -Os on x86_64-linux-gnu)

2014-06-11  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/61452
	* tree-ssa-sccvn.c (visit_phi): Remove pointless setting of
	expr and has_constants in case we found a leader.
	(simplify_binary_expression): Always valueize operands first.
	(simplify_unary_expression): Likewise.

	* gcc.dg/torture/pr61452.c: New testcase.

From-SVN: r211450
This commit is contained in:
Richard Biener 2014-06-11 11:17:21 +00:00 committed by Richard Biener
parent ac8345a525
commit c1604254c5
3 changed files with 69 additions and 61 deletions

View file

@ -1,3 +1,8 @@
2014-06-11 Richard Biener <rguenther@suse.de>
PR tree-optimization/61452
* gcc.dg/torture/pr61452.c: New testcase.
2014-06-11 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/34049

View file

@ -0,0 +1,31 @@
/* { dg-do run } */
int a, b;
short c, d;
char e, f;
int
fn1 (int p1, char p2)
{
return p1 || p2 ? 0 : p2;
}
void
fn2 ()
{
for (; a;)
{
int g;
g = c = e;
for (; a;)
b = fn1 (g = d = e, g);
f = g;
}
}
int
main ()
{
fn2 ();
return 0;
}

View file

@ -3140,35 +3140,12 @@ visit_phi (gimple phi)
/* If all value numbered to the same value, the phi node has that
value. */
if (allsame)
{
if (is_gimple_min_invariant (sameval))
{
VN_INFO (PHI_RESULT (phi))->has_constants = true;
if (sameval != VN_TOP)
VN_INFO (PHI_RESULT (phi))->expr = sameval;
}
else
{
VN_INFO (PHI_RESULT (phi))->has_constants = false;
if (sameval != VN_TOP)
VN_INFO (PHI_RESULT (phi))->expr = sameval;
}
if (TREE_CODE (sameval) == SSA_NAME)
return visit_copy (PHI_RESULT (phi), sameval);
return set_ssa_val_to (PHI_RESULT (phi), sameval);
}
return set_ssa_val_to (PHI_RESULT (phi), sameval);
/* Otherwise, see if it is equivalent to a phi node in this block. */
result = vn_phi_lookup (phi);
if (result)
{
if (TREE_CODE (result) == SSA_NAME)
changed = visit_copy (PHI_RESULT (phi), result);
else
changed = set_ssa_val_to (PHI_RESULT (phi), result);
}
changed = set_ssa_val_to (PHI_RESULT (phi), result);
else
{
vn_phi_insert (phi, PHI_RESULT (phi));
@ -3262,24 +3239,18 @@ simplify_binary_expression (gimple stmt)
catch those with constants. The goal here is to simultaneously
combine constants between expressions, but avoid infinite
expansion of expressions during simplification. */
if (TREE_CODE (op0) == SSA_NAME)
{
if (VN_INFO (op0)->has_constants
op0 = vn_valueize (op0);
if (TREE_CODE (op0) == SSA_NAME
&& (VN_INFO (op0)->has_constants
|| TREE_CODE_CLASS (code) == tcc_comparison
|| code == COMPLEX_EXPR)
op0 = vn_get_expr_for (op0);
else
op0 = vn_valueize (op0);
}
|| code == COMPLEX_EXPR))
op0 = vn_get_expr_for (op0);
if (TREE_CODE (op1) == SSA_NAME)
{
if (VN_INFO (op1)->has_constants
|| code == COMPLEX_EXPR)
op1 = vn_get_expr_for (op1);
else
op1 = vn_valueize (op1);
}
op1 = vn_valueize (op1);
if (TREE_CODE (op1) == SSA_NAME
&& (VN_INFO (op1)->has_constants
|| code == COMPLEX_EXPR))
op1 = vn_get_expr_for (op1);
/* Pointer plus constant can be represented as invariant address.
Do so to allow further propatation, see also tree forwprop. */
@ -3333,28 +3304,29 @@ simplify_unary_expression (gimple stmt)
|| code == BIT_FIELD_REF)
op0 = TREE_OPERAND (op0, 0);
if (TREE_CODE (op0) != SSA_NAME)
return NULL_TREE;
orig_op0 = op0;
if (VN_INFO (op0)->has_constants)
op0 = vn_get_expr_for (op0);
else if (CONVERT_EXPR_CODE_P (code)
|| code == REALPART_EXPR
|| code == IMAGPART_EXPR
|| code == VIEW_CONVERT_EXPR
|| code == BIT_FIELD_REF)
op0 = vn_valueize (op0);
if (TREE_CODE (op0) == SSA_NAME)
{
/* We want to do tree-combining on conversion-like expressions.
Make sure we feed only SSA_NAMEs or constants to fold though. */
tree tem = vn_get_expr_for (op0);
if (UNARY_CLASS_P (tem)
|| BINARY_CLASS_P (tem)
|| TREE_CODE (tem) == VIEW_CONVERT_EXPR
|| TREE_CODE (tem) == SSA_NAME
|| TREE_CODE (tem) == CONSTRUCTOR
|| is_gimple_min_invariant (tem))
op0 = tem;
if (VN_INFO (op0)->has_constants)
op0 = vn_get_expr_for (op0);
else if (CONVERT_EXPR_CODE_P (code)
|| code == REALPART_EXPR
|| code == IMAGPART_EXPR
|| code == VIEW_CONVERT_EXPR
|| code == BIT_FIELD_REF)
{
/* We want to do tree-combining on conversion-like expressions.
Make sure we feed only SSA_NAMEs or constants to fold though. */
tree tem = vn_get_expr_for (op0);
if (UNARY_CLASS_P (tem)
|| BINARY_CLASS_P (tem)
|| TREE_CODE (tem) == VIEW_CONVERT_EXPR
|| TREE_CODE (tem) == SSA_NAME
|| TREE_CODE (tem) == CONSTRUCTOR
|| is_gimple_min_invariant (tem))
op0 = tem;
}
}
/* Avoid folding if nothing changed, but remember the expression. */