This merges the two functions that have much in common and prettifies
the code-gen.

Committed.

Richard.

2014-08-21  Richard Biener  <rguent...@suse.de>

        * genmatch.c (dt_simplify::gen): New function merged
        from ...
        (dt_simplify::gen_gimple, dt_simplify::gen_generic): ... these,
        made to simple dispatchers.

Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c      (revision 214266)
+++ gcc/genmatch.c      (working copy)
@@ -457,8 +457,9 @@ struct dt_simplify: public dt_node
       indexes[i] = indexes_[i];
   }
 
-  virtual void gen_gimple (FILE *f);
-  virtual void gen_generic (FILE *f);
+  void gen (FILE *f, bool);
+  virtual void gen_gimple (FILE *f) { gen (f, true); }
+  virtual void gen_generic (FILE *f) { gen (f, false); }
 };
 
 template<>
@@ -1690,10 +1691,9 @@ dt_operand::gen_generic_kids (FILE *f)
 
 
 void
-dt_simplify::gen_gimple (FILE *f)
+dt_simplify::gen (FILE *f, bool gimple)
 {
-
-  fprintf (f, "/* simplify %u */\n", pattern_no);
+  output_line_directive (f, s->result_location);
 
   fprintf (f, "{\n");
   fprintf (f, "tree captures[%u] ATTRIBUTE_UNUSED = {};\n", 
dt_simplify::capture_max);
@@ -1708,20 +1708,24 @@ dt_simplify::gen_gimple (FILE *f)
   if (s->ifexpr_vec != vNULL)
     {
       fprintf (f, "if (");
-      // we add in LIFO order, so traverse backwards
-      for (unsigned i = s->ifexpr_vec.length (); i; --i)
-       {
-         fprintf (f, "(");
-         s->ifexpr_vec[i - 1]->gen_transform (f, NULL, true, 1, "type");
-         fprintf (f, ")");
-         if (i > 1)
-           fprintf (f, " && ");
-       }
+      if (s->ifexpr_vec.length () == 1)
+       s->ifexpr_vec[0]->gen_transform (f, NULL, true, 1, "type");
+      else
+       // we add in LIFO order, so traverse backwards
+       for (unsigned i = s->ifexpr_vec.length (); i; --i)
+         {
+           fprintf (f, "(");
+           s->ifexpr_vec[i - 1]->gen_transform (f, NULL, true, 1, "type");
+           fprintf (f, ")");
+           if (i > 1)
+             fprintf (f, "\n&& ");
+         }
       fprintf (f, ")\n");
       fprintf (f, "{\n");
     }
-      output_line_directive (f, s->result_location);
 
+  if (gimple)
+    {
       if (s->result->type == operand::OP_EXPR)
        {
          expr *e = static_cast <expr *> (s->result);
@@ -1745,49 +1749,10 @@ dt_simplify::gen_gimple (FILE *f)
        }
       else
        gcc_unreachable ();
-
       fprintf (f, "return true;\n");
-      if (s->ifexpr_vec != vNULL)
-       fprintf (f, "}\n");
-
-  fprintf (f, "}\n");
-}
-
-
-void
-dt_simplify::gen_generic (FILE *f)
-{
-
-  fprintf (f, "/* simplify %u */\n", pattern_no);
-
-  fprintf (f, "{\n");
-  fprintf (f, "tree captures[%u] ATTRIBUTE_UNUSED = {};\n", 
dt_simplify::capture_max);
-
-  for (unsigned i = 0; i < dt_simplify::capture_max; ++i)
-    if (indexes[i])
-      {
-       char opname[20];
-       fprintf (f, "captures[%u] = %s;\n", i, indexes[i]->get_name (opname));
-      }
-
-  if (s->ifexpr_vec != vNULL)
-    {
-      fprintf (f, "if (\n");
-      // we add in LIFO order, so traverse backwards
-      for (unsigned i = s->ifexpr_vec.length (); i; --i)
-        {
-          fprintf (f, "(");
-          s->ifexpr_vec[i - 1]->gen_transform (f, NULL, false, 1, "type");
-          fprintf (f, ")");
-          if (i > 1)
-            fprintf (f, " && ");
-        }
-      fprintf (f, ")\n");
-      fprintf (f, "{\n");
     }
-
-      output_line_directive (f, s->result_location);
-
+  else /* GENERIC */
+    {
       if (s->result->type == operand::OP_EXPR)
        {
          expr *e = static_cast <expr *> (s->result);
@@ -1818,15 +1783,15 @@ dt_simplify::gen_generic (FILE *f)
        }
       else
        gcc_unreachable ();
+    }
 
-      if (s->ifexpr_vec != vNULL)
-       fprintf (f, "}\n");
+  if (s->ifexpr_vec != vNULL)
+    fprintf (f, "}\n");
 
   fprintf (f, "}\n");
 }
 
 
-
 void
 decision_tree::gen_gimple (FILE *f)
 {

Reply via email to