This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] genmatch fix (PR tree-optimization/71563)
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Tue, 03 Jan 2017 07:52:16 +0100
- Subject: Re: [PATCH] genmatch fix (PR tree-optimization/71563)
- Authentication-results: sourceware.org; auth=none
- References: <20161220190933.GO21933@tucnak> <alpine.DEB.2.20.1612202116420.2423@laptop-mg.saclay.inria.fr> <20161220204503.GP21933@tucnak> <20161229211834.GR21933@tucnak> <20170102075545.GY21933@tucnak>
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