This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] genmatch fix (PR tree-optimization/71563)


On January 2, 2017 8:55:45 AM GMT+01:00, Jakub Jelinek <jakub@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  <jakub@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



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]