]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-ssa-sccvn.c (visit_use): Also constant-fold calls.
authorRichard Biener <rguenther@suse.de>
Fri, 16 May 2014 07:57:46 +0000 (07:57 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 16 May 2014 07:57:46 +0000 (07:57 +0000)
2014-05-16  Richard Biener  <rguenther@suse.de>

* tree-ssa-sccvn.c (visit_use): Also constant-fold calls.

* gcc.dg/tree-ssa/ssa-fre-41.c: New testcase.

From-SVN: r210491

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-41.c [new file with mode: 0644]
gcc/tree-ssa-sccvn.c

index 5a29dedf7c79218db5ba6da6dcefeeb7cdf57c1c..3df0bb4022ed6fef3b2157e8ab630655acbf7e72 100644 (file)
@@ -1,3 +1,7 @@
+2014-05-16  Richard Biener  <rguenther@suse.de>
+
+       * tree-ssa-sccvn.c (visit_use): Also constant-fold calls.
+
 2014-05-15  Peter Bergner  <bergner@vnet.ibm.com>
 
        PR target/61193
index 96b63036f3a5c878a10d0da6864003b89a7b5fa7..8c52f8cd9d8465a419082abe9a128dc814f9803d 100644 (file)
@@ -1,3 +1,7 @@
+2014-05-16  Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/tree-ssa/ssa-fre-41.c: New testcase.
+
 2014-05-15  Martin Jambor  <mjambor@suse.cz>
 
        PR ipa/61085
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-41.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-41.c
new file mode 100644 (file)
index 0000000..82ca746
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-fre1" } */
+
+int x;
+int foo (void)
+{
+  x = 1;
+  return __builtin_ffs (x);
+}
+
+/* { dg-final { scan-tree-dump-not "ffs" "fre1" } } */
+/* { dg-final { cleanup-tree-dump "fre1" } } */
index 07b9bd2b1ab608350653c2221fce053bbfd615ef..93a7e301240eeb7aa629a5e1486c66315148afc7 100644 (file)
@@ -3566,28 +3566,70 @@ visit_use (tree use)
       else if (is_gimple_call (stmt))
        {
          tree lhs = gimple_call_lhs (stmt);
-
-         /* ???  We could try to simplify calls.  */
-
          if (lhs && TREE_CODE (lhs) == SSA_NAME)
            {
-             if (stmt_has_constants (stmt))
-               VN_INFO (lhs)->has_constants = true;
-             else
+             /* Try constant folding based on our current lattice.  */
+             tree simplified = gimple_fold_stmt_to_constant_1 (stmt,
+                                                               vn_valueize);
+             if (simplified)
+               {
+                 if (dump_file && (dump_flags & TDF_DETAILS))
+                   {
+                     fprintf (dump_file, "call ");
+                     print_gimple_expr (dump_file, stmt, 0, 0);
+                     fprintf (dump_file, " simplified to ");
+                     print_generic_expr (dump_file, simplified, 0);
+                     if (TREE_CODE (lhs) == SSA_NAME)
+                       fprintf (dump_file, " has constants %d\n",
+                                expr_has_constants (simplified));
+                     else
+                       fprintf (dump_file, "\n");
+                   }
+               }
+             /* Setting value numbers to constants will occasionally
+                screw up phi congruence because constants are not
+                uniquely associated with a single ssa name that can be
+                looked up.  */
+             if (simplified
+                 && is_gimple_min_invariant (simplified))
                {
-                 /* We reset expr and constantness here because we may
-                    have been value numbering optimistically, and
-                    iterating.  They may become non-constant in this case,
-                    even if they were optimistically constant.  */
-                 VN_INFO (lhs)->has_constants = false;
-                 VN_INFO (lhs)->expr = NULL_TREE;
+                 VN_INFO (lhs)->expr = simplified;
+                 VN_INFO (lhs)->has_constants = true;
+                 changed = set_ssa_val_to (lhs, simplified);
+                 if (gimple_vdef (stmt))
+                   changed |= set_ssa_val_to (gimple_vdef (stmt),
+                                              gimple_vuse (stmt));
+                 goto done;
                }
-
-             if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
+             else if (simplified
+                      && TREE_CODE (simplified) == SSA_NAME)
                {
-                 changed = defs_to_varying (stmt);
+                 changed = visit_copy (lhs, simplified);
+                 if (gimple_vdef (stmt))
+                   changed |= set_ssa_val_to (gimple_vdef (stmt),
+                                              gimple_vuse (stmt));
                  goto done;
                }
+             else
+               {
+                 if (stmt_has_constants (stmt))
+                   VN_INFO (lhs)->has_constants = true;
+                 else
+                   {
+                     /* We reset expr and constantness here because we may
+                        have been value numbering optimistically, and
+                        iterating.  They may become non-constant in this case,
+                        even if they were optimistically constant.  */
+                     VN_INFO (lhs)->has_constants = false;
+                     VN_INFO (lhs)->expr = NULL_TREE;
+                   }
+
+                 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
+                   {
+                     changed = defs_to_varying (stmt);
+                     goto done;
+                   }
+               }
            }
 
          if (!gimple_call_internal_p (stmt)