Commit c1604254 by Richard Biener Committed by Richard Biener

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