On January 2, 2017 8:55:45 AM GMT+01:00, Jakub Jelinek <ja...@redhat.com> wrote: >On Thu, Dec 29, 2016 at 10:18:34PM +0100, Jakub Jelinek wrote: >> On Tue, Dec 20, 2016 at 09:45:03PM +0100, Jakub Jelinek wrote: >> > That is what I tried first, but there is some bug in genmatch.c >that >> > prevents it. The: >> > (for vec (VECTOR_CST CONSTRUCTOR) >> > (simplify >> > (shiftrotate @0 vec@1) >> > results in case SSA_NAME: being added to a switch: >> > case SSA_NAME: >> > if (do_valueize (valueize, op1) != NULL_TREE) >> > { >> > gimple *def_stmt = SSA_NAME_DEF_STMT (op1); >> > if (gassign *def = dyn_cast <gassign *> (def_stmt)) >> > switch (gimple_assign_rhs_code (def)) >> > { >> > case CONSTRUCTOR: >> > and the SSA_NAME@1 in another simplification resulted in another >> > case SSA_NAME: >> > into the same switch (rather than appending to the case SSA_NAME). >> >> This patch attempts to deal with that. The change for the new >version of >> the patch with SSA_NAME@1 I'll post right away is (twice). Two case >SSA_NAME: >> in a single switch of course don't work well. > >Oops, forgot to add the actual patch, here it is:
OK. Richard. >2017-01-02 Jakub Jelinek <ja...@redhat.com> > > * genmatch.c (dt_node::gen_kids_1): If generic_exprs include SSA_NAME > and exprs_len || fns_len, emit the code for SSA_NAME next to the exprs > and fns handling, rather than in a separate case SSA_NAME. > >--- gcc/genmatch.c.jj 2016-11-09 16:34:58.000000000 +0100 >+++ gcc/genmatch.c 2016-12-29 22:11:25.088950033 +0100 >@@ -2913,6 +2913,20 @@ dt_node::gen_kids_1 (FILE *f, int indent > > indent -= 6; > fprintf_indent (f, indent, " }\n"); >+ /* See if there is SSA_NAME among generic_exprs and if yes, emit >it >+ here rather than in the next loop. */ >+ for (unsigned i = 0; i < generic_exprs.length (); ++i) >+ { >+ expr *e = as_a <expr *>(generic_exprs[i]->op); >+ id_base *op = e->operation; >+ if (*op == SSA_NAME && (exprs_len || fns_len)) >+ { >+ fprintf_indent (f, indent + 4, "{\n"); >+ generic_exprs[i]->gen (f, indent + 6, gimple); >+ fprintf_indent (f, indent + 4, "}\n"); >+ } >+ } >+ > fprintf_indent (f, indent, " break;\n"); > } > >@@ -2922,6 +2936,9 @@ dt_node::gen_kids_1 (FILE *f, int indent > id_base *op = e->operation; > if (*op == CONVERT_EXPR || *op == NOP_EXPR) > fprintf_indent (f, indent, "CASE_CONVERT:\n"); >+ else if (*op == SSA_NAME && (exprs_len || fns_len)) >+ /* Already handled above. */ >+ continue; > else > fprintf_indent (f, indent, "case %s:\n", op->id); > fprintf_indent (f, indent, " {\n"); > > > Jakub