gimple-match-head.c (do_valueize): Return OP if valueize returns NULL_TREE.
authorRichard Biener <rguenther@suse.de>
Wed, 26 Jul 2017 11:35:45 +0000 (11:35 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 26 Jul 2017 11:35:45 +0000 (11:35 +0000)
2017-07-26  Richard Biener  <rguenther@suse.de>

* gimple-match-head.c (do_valueize): Return OP if valueize
returns NULL_TREE.
(get_def): New helper to get at the def stmt of a SSA name
if valueize allows.
* genmatch.c (dt_node::gen_kids_1): Use get_def instead of
do_valueize to get at the def stmt.
(dt_operand::gen_gimple_expr): Simplify do_valueize calls.

* gcc/testsuite/gcc.dg/pr70920-2.c: Adjust for transform already
happening in ccp1.
* gcc/testsuite/gcc.dg/pr70920-4.c: Likewise.

From-SVN: r250565

gcc/ChangeLog
gcc/genmatch.c
gcc/gimple-match-head.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr70920-2.c
gcc/testsuite/gcc.dg/pr70920-4.c

index 9bd8736ad58fa31d320836da1d9615216fad72cd..ff746ffc6213981feb99f9ef005b1cb6a7675a89 100644 (file)
@@ -1,3 +1,13 @@
+2017-07-26  Richard Biener  <rguenther@suse.de>
+
+       * gimple-match-head.c (do_valueize): Return OP if valueize
+       returns NULL_TREE.
+       (get_def): New helper to get at the def stmt of a SSA name
+       if valueize allows.
+       * genmatch.c (dt_node::gen_kids_1): Use get_def instead of
+       do_valueize to get at the def stmt.
+       (dt_operand::gen_gimple_expr): Simplify do_valueize calls.
+
 2017-07-26  Wilco Dijkstra  <wdijkstr@arm.com>
 
        PR middle-end/46932
index 43f837236588e6c81d21c51a5d45a69fe51b85a8..6564a1aa501c9f7eb8768a6e795afdd5721e4f40 100644 (file)
@@ -2646,6 +2646,7 @@ dt_operand::gen_gimple_expr (FILE *f, int indent)
   expr *e = static_cast<expr *> (op);
   id_base *id = e->operation;
   unsigned n_ops = e->ops.length ();
+  unsigned n_braces = 0;
 
   for (unsigned i = 0; i < n_ops; ++i)
     {
@@ -2678,14 +2679,15 @@ dt_operand::gen_gimple_expr (FILE *f, int indent)
                              "if ((TREE_CODE (%s) == SSA_NAME\n",
                              child_opname);
              fprintf_indent (f, indent,
-                             "     || is_gimple_min_invariant (%s))\n",
+                             "     || is_gimple_min_invariant (%s)))\n",
                              child_opname);
-             fprintf_indent (f, indent,
-                             "    && (%s = do_valueize (valueize, %s)))\n",
-                             child_opname, child_opname);
              fprintf_indent (f, indent,
                              "  {\n");
              indent += 4;
+             n_braces++;
+             fprintf_indent (f, indent,
+                             "%s = do_valueize (valueize, %s);\n",
+                             child_opname, child_opname);
              continue;
            }
          else
@@ -2698,10 +2700,8 @@ dt_operand::gen_gimple_expr (FILE *f, int indent)
                        "tree %s = gimple_call_arg (def, %u);\n",
                        child_opname, i);
       fprintf_indent (f, indent,
-                     "if ((%s = do_valueize (valueize, %s)))\n",
+                     "%s = do_valueize (valueize, %s);\n",
                      child_opname, child_opname);
-      fprintf_indent (f, indent, "  {\n");
-      indent += 4;
     }
   /* While the toplevel operands are canonicalized by the caller
      after valueizing operands of sub-expressions we have to
@@ -2726,7 +2726,7 @@ dt_operand::gen_gimple_expr (FILE *f, int indent)
        }
     }
 
-  return n_ops;
+  return n_braces;
 }
 
 /* Generate GENERIC matching code for the decision tree operand.  */
@@ -2867,14 +2867,10 @@ dt_node::gen_kids_1 (FILE *f, int indent, bool gimple,
       fprintf_indent (f, indent,
                      "case SSA_NAME:\n");
       fprintf_indent (f, indent,
-                     "  if (do_valueize (valueize, %s) != NULL_TREE)\n",
+                     "  if (gimple *def_stmt = get_def (valueize, %s))\n",
                      kid_opname);
       fprintf_indent (f, indent,
                      "    {\n");
-      fprintf_indent (f, indent,
-                     "      gimple *def_stmt = SSA_NAME_DEF_STMT (%s);\n",
-                     kid_opname);
-
       indent += 6;
       if (exprs_len)
        {
index 5f6aa273b965de6b75eebadda354b0aac46ae28d..8ad1f8c5eaea7c145ae92ce595e0177e3aa8dce9 100644 (file)
@@ -779,10 +779,25 @@ inline tree
 do_valueize (tree (*valueize)(tree), tree op)
 {
   if (valueize && TREE_CODE (op) == SSA_NAME)
-    return valueize (op);
+    {
+      tree tem = valueize (op);
+      if (tem)
+       return tem;
+    }
   return op;
 }
 
+/* Helper for the autogenerated code, get at the definition of NAME when
+   VALUEIZE allows that.  */
+
+inline gimple *
+get_def (tree (*valueize)(tree), tree name)
+{
+  if (valueize && ! valueize (name))
+    return NULL;
+  return SSA_NAME_DEF_STMT (name);
+}
+
 /* Routine to determine if the types T1 and T2 are effectively
    the same for GIMPLE.  If T1 or T2 is not a type, the test
    applies to their TREE_TYPE.  */
index e7991a67d636a016b85e5a8c250ab4b051f00a67..aaec07c00269d6785208c1863769b8deb935d12b 100644 (file)
@@ -1,3 +1,9 @@
+2017-07-26  Richard Biener  <rguenther@suse.de>
+
+       * gcc/testsuite/gcc.dg/pr70920-2.c: Adjust for transform already
+       happening in ccp1.
+       * gcc/testsuite/gcc.dg/pr70920-4.c: Likewise.
+
 2017-07-26  Wilco Dijkstra  <wdijkstr@arm.com>
 
        PR middle-end/46932
index 2db9897bad51abc7dc87ebace94078e077adde03..98072247e9462dd554e45e9d6b3c8fcc085309e0 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-forwprop-details" } */
+/* { dg-options "-O2 -fdump-tree-ccp1-details" } */
 
 #include <stdint.h>
 
@@ -18,4 +18,4 @@ foo (int *a)
     }
 }
 
-/* { dg-final { scan-tree-dump "gimple_simplified to if \\(a_\[0-9\]*\\(D\\) == 0B\\)" "forwprop1" } } */
+/* { dg-final { scan-tree-dump "gimple_simplified to if \\(a_\[0-9\]*\\(D\\) == 0B\\)" "ccp1" } } */
index e9c2b9587e578167d0aead5b68d4317ade00d5ee..70973cb162a1920e809d8df1adabbdec15f2fb3c 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-require-effective-target lp64 } */
-/* { dg-options "-O2 -fdump-tree-forwprop-details -Wno-int-to-pointer-cast" } */
+/* { dg-options "-O2 -fdump-tree-ccp1 -Wno-int-to-pointer-cast" } */
 
 #include <stdint.h>
 
@@ -19,4 +19,4 @@ foo (int a)
     }
 }
 
-/* { dg-final { scan-tree-dump "if \\(_\[0-9\]* == 0\\)" "forwprop1" } } */
+/* { dg-final { scan-tree-dump "if \\(a_\[0-9\]*\\(D\\) == 0\\)" "ccp1" } } */