aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-06-11 11:17:21 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-06-11 11:17:21 +0000
commitc1604254c5a86a29e87e11520f4698fd2d2ce99f (patch)
treedc1836abf9516c940ddea1b6de6e2edd678210f2
parentac8345a525674204550c7a9f5cbb3deec7467d6d (diff)
downloadgcc-c1604254c5a86a29e87e11520f4698fd2d2ce99f.zip
gcc-c1604254c5a86a29e87e11520f4698fd2d2ce99f.tar.gz
gcc-c1604254c5a86a29e87e11520f4698fd2d2ce99f.tar.bz2
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
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr61452.c31
-rw-r--r--gcc/tree-ssa-sccvn.c94
3 files changed, 69 insertions, 61 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3c066a9..c586b44 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.dg/torture/pr61452.c b/gcc/testsuite/gcc.dg/torture/pr61452.c
new file mode 100644
index 0000000..a62de30
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr61452.c
@@ -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;
+}
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 2583375..b949bfa 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -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. */