diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c98fac170a8d7160882ffa0453ffec6e2f282767..8ff713550efda2437871c6909b552905609a94e9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2002-05-14  Vladimir Makarov  <vmakarov@redhat.com>
+
+	* genautomata.c (transform_3): Add code for transformation
+	`(A,B,...)+C -> A+C,B,...'.
+
 Tue May 14 12:48:22 CEST 2002  Jan Hubicka  <jh@suse.cz>
 
 	* final.c (end_final): Do not output profile_arcs constructor, when
diff --git a/gcc/genautomata.c b/gcc/genautomata.c
index 783d50ea6a029a223ae65819773d8bd9b3372940..2c7c883b84e8250dd7f2bb51b717746b38661bb7 100644
--- a/gcc/genautomata.c
+++ b/gcc/genautomata.c
@@ -4637,7 +4637,8 @@ transform_2 (regexp)
 
 /* The function makes transformations
    ...,A|B|...,C,... -> (...,A,C,...)|(...,B,C,...)|...
-   ...+(A|B|...)+C+... -> (...+A+C+...)|(...+B+C+...)|...  */
+   ...+(A|B|...)+C+... -> (...+A+C+...)|(...+B+C+...)|...
+   ...+(A,B,...)+C+... -> (...+A+C+...),B,...  */
 static regexp_t
 transform_3 (regexp)
      regexp_t regexp;
@@ -4693,8 +4694,8 @@ transform_3 (regexp)
     }
   else if (regexp->mode == rm_allof)
     {
-      regexp_t oneof;
-      int oneof_index;
+      regexp_t oneof, seq;
+      int oneof_index, seq_index;
       regexp_t result;
       regexp_t allof;
       int i, j;
@@ -4739,6 +4740,45 @@ transform_3 (regexp)
 	  regexp_transformed_p = 1;
 	  regexp = result;
 	}
+      for (i = 0; i < regexp->regexp.allof.regexps_num; i++)
+	if (regexp->regexp.allof.regexps [i]->mode == rm_sequence)
+	  {
+	    seq_index = i;
+	    seq = regexp->regexp.allof.regexps [i];
+	    break;
+	  }
+      if (i < regexp->regexp.allof.regexps_num)
+	{
+	  if (seq->regexp.sequence.regexps_num <= 1
+	      || regexp->regexp.allof.regexps_num <= 1)
+	    abort ();
+	  result = create_node (sizeof (struct regexp)
+				+ sizeof (regexp_t)
+				* (seq->regexp.sequence.regexps_num - 1));
+	  result->mode = rm_sequence;
+	  result->pos = regexp->pos;
+	  result->regexp.sequence.regexps_num
+	    = seq->regexp.sequence.regexps_num;
+	  allof = create_node (sizeof (struct regexp)
+			       + sizeof (regexp_t)
+			       * (regexp->regexp.allof.regexps_num - 1));
+	  allof->mode = rm_allof;
+	  allof->pos = regexp->pos;
+	  allof->regexp.allof.regexps_num = regexp->regexp.allof.regexps_num;
+	  result->regexp.sequence.regexps [0] = allof;
+	  for (j = 0; j < allof->regexp.allof.regexps_num; j++)
+	    if (j != seq_index)
+	      allof->regexp.allof.regexps [j]
+		= copy_insn_regexp (regexp->regexp.allof.regexps [j]);
+	    else
+	      allof->regexp.allof.regexps [j]
+		= copy_insn_regexp (seq->regexp.sequence.regexps [0]);
+	  for (i = 1; i < result->regexp.sequence.regexps_num; i++)
+	    result->regexp.sequence.regexps [i]
+	      = copy_insn_regexp (seq->regexp.sequence.regexps [i]);
+	  regexp_transformed_p = 1;
+	  regexp = result;
+	}
     }
   return regexp;
 }