On Tue, 10 Jun 2014, Richard Biener wrote:

> 
> The following fixes PR61452 - when keeping a lattice value at
> VARYING we shouldn't adjust the lattice ->expr or ->has_constants.

Needs adjustments in the simplifiers, otherwise we regress
ssa-fre-39.c.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

There are cleanup opportunities now, but the match-and-simplify
gets rid of all of this code so I won't bother applying TLC now.

Richard.

2014-06-11  Richard Biener  <rguent...@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.

Index: gcc/testsuite/gcc.dg/torture/pr61452.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr61452.c      (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr61452.c      (working copy)
***************
*** 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;
+ }
Index: gcc/tree-ssa-sccvn.c
===================================================================
--- gcc/tree-ssa-sccvn.c        (revision 211435)
+++ gcc/tree-ssa-sccvn.c        (working copy)
@@ -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,31 +3304,32 @@ 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.  */
+  /* Avoid folding if nothing changed.  */
   if (op0 == orig_op0)
     return NULL_TREE;
 

Reply via email to