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; }