]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
genautomata.c (NO_COMB_OPTION): New macro.
authorBernd Schmidt <bernds@codesourcery.com>
Tue, 30 Aug 2011 13:15:38 +0000 (13:15 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Tue, 30 Aug 2011 13:15:38 +0000 (13:15 +0000)
* genautomata.c (NO_COMB_OPTION): New macro.
(no_comb_flag): New static variable.
(gen_automata_option): Handle NO_COMB_OPTION.
(comb_vect_p): False if no_comb_flag.
(add_vect): Move computation of min/max values.  Return early if
no_comb_flag.
* doc/md.texi (automata_option): Document no-comb-vect.

From-SVN: r178295

gcc/ChangeLog
gcc/doc/md.texi
gcc/genautomata.c

index 105cfce613a9097cd67eb84f0a813a1e6e21c2c3..3170e41bf466028caab8f2d903dfb4348824ba15 100644 (file)
@@ -1,3 +1,13 @@
+2011-08-30  Bernd Schmidt  <bernds@codesourcery.com>
+
+       * genautomata.c (NO_COMB_OPTION): New macro.
+       (no_comb_flag): New static variable.
+       (gen_automata_option): Handle NO_COMB_OPTION.
+       (comb_vect_p): False if no_comb_flag.
+       (add_vect): Move computation of min/max values.  Return early if
+       no_comb_flag.
+       * doc/md.texi (automata_option): Document no-comb-vect.
+
 2011-08-30  Christian Bruel  <christian.bruel@st.com>
 
        * coverage.c (coverage_init): Check flag_branch_probabilities instead of
index ffb8843633ef2932fccc1a8b80f27ff7970bfb06..24f591c5d9a4dbe3af99362c64e628a7f38c6ab3 100644 (file)
@@ -7967,6 +7967,13 @@ verification and debugging.
 @dfn{w} means a generation of warning instead of error for
 non-critical errors.
 
+@item
+@dfn{no-comb-vect} prevents the automaton generator from generating
+two data structures and comparing them for space efficiency.  Using
+a comb vector to represent transitions may be better, but it can be
+very expensive to construct.  This option is useful if the build
+process spends an unacceptably long time in genautomata.
+
 @item
 @dfn{ndfa} makes nondeterministic finite state automata.  This affects
 the treatment of operator @samp{|} in the regular expressions.  The
index d614e3a855d98aa7d235809e6142b9aab72bc9b2..f331f507dae86bd1138c795f60f39e035cd750c3 100644 (file)
@@ -253,6 +253,7 @@ static arc_t next_out_arc              (arc_t);
 #define W_OPTION "-w"
 #define NDFA_OPTION "-ndfa"
 #define COLLAPSE_OPTION "-collapse-ndfa"
+#define NO_COMB_OPTION "-no-comb-vect"
 #define PROGRESS_OPTION "-progress"
 
 /* The following flags are set up by function `initiate_automaton_gen'.  */
@@ -268,6 +269,9 @@ static int collapse_flag;
 /* Do not make minimization of DFA (`-no-minimization').  */
 static int no_minimization_flag;
 
+/* Do not try to generate a comb vector (`-no-comb-vect').  */
+static int no_comb_flag;
+
 /* Value of this variable is number of automata being generated.  The
    actual number of automata may be less this value if there is not
    sufficient number of units.  This value is defined by argument of
@@ -1539,6 +1543,8 @@ gen_automata_option (rtx def)
     ndfa_flag = 1;
   else if (strcmp (XSTR (def, 0), COLLAPSE_OPTION + 1) == 0)
     collapse_flag = 1;
+  else if (strcmp (XSTR (def, 0), NO_COMB_OPTION + 1) == 0)
+    no_comb_flag = 1;
   else if (strcmp (XSTR (def, 0), PROGRESS_OPTION + 1) == 0)
     progress_flag = 1;
   else
@@ -7251,6 +7257,8 @@ static int undefined_vect_el_value;
 static int
 comb_vect_p (state_ainsn_table_t tab)
 {
+  if (no_comb_flag)
+    return false;
   return  (2 * VEC_length (vect_el_t, tab->full_vect)
            > 5 * VEC_length (vect_el_t, tab->comb_vect));
 }
@@ -7369,6 +7377,22 @@ add_vect (state_ainsn_table_t tab, int vect_num, vla_hwint_t vect)
       VEC_replace (vect_el_t, tab->full_vect, full_base + i,
                   VEC_index (vect_el_t, vect, i));
   }
+
+  /* The comb_vect min/max values are also used for the full vector, so
+     compute them now.  */
+  for (vect_index = 0; vect_index < vect_length; vect_index++)
+    if (VEC_index (vect_el_t, vect, vect_index) != undefined_vect_el_value)
+      {
+       vect_el_t x = VEC_index (vect_el_t, vect, vect_index);
+        gcc_assert (x >= 0);
+        if (tab->max_comb_vect_el_value < x)
+          tab->max_comb_vect_el_value = x;
+        if (tab->min_comb_vect_el_value > x)
+          tab->min_comb_vect_el_value = x;
+      }
+  if (no_comb_flag)
+    return;
+
   /* Form comb vector in the table: */
   gcc_assert (VEC_length (vect_el_t, tab->comb_vect)
              == VEC_length (vect_el_t, tab->check_vect));
@@ -7478,10 +7502,6 @@ add_vect (state_ainsn_table_t tab, int vect_num, vla_hwint_t vect)
                               comb_vect_index + vect_index)
                    == undefined_vect_el_value);
         gcc_assert (x >= 0);
-        if (tab->max_comb_vect_el_value < x)
-          tab->max_comb_vect_el_value = x;
-        if (tab->min_comb_vect_el_value > x)
-          tab->min_comb_vect_el_value = x;
        VEC_replace (vect_el_t, tab->comb_vect,
                     comb_vect_index + vect_index, x);
        VEC_replace (vect_el_t, tab->check_vect,