From c1604254c5a86a29e87e11520f4698fd2d2ce99f Mon Sep 17 00:00:00 2001
From: Richard Biener <rguenther@suse.de>
Date: Wed, 11 Jun 2014 11:17:21 +0000
Subject: [PATCH] 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
---
 gcc/testsuite/ChangeLog                |  5 ++
 gcc/testsuite/gcc.dg/torture/pr61452.c | 31 +++++++++
 gcc/tree-ssa-sccvn.c                   | 94 +++++++++-----------------
 3 files changed, 69 insertions(+), 61 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr61452.c

diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3c066a96f954..c586b44a030d 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 000000000000..a62de30fd846
--- /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 2583375f32b6..b949bfa725d0 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.  */
-- 
GitLab