On Mon, 18 May 2015, Prathamesh Kulkarni wrote:

> On 18 May 2015 at 14:12, Richard Biener <rguent...@suse.de> wrote:
> > On Sat, 16 May 2015, Prathamesh Kulkarni wrote:
> >
> >> Hi,
> >> genmatch generates incorrect code for following (artificial) pattern:
> >>
> >> (for op (plus)
> >>       op2 (op)
> >>   (simplify
> >>     (op @x @y)
> >>     (op2 @x @y)
> >>
> >> generated gimple code: http://pastebin.com/h1uau9qB
> >> 'op' is not replaced in the generated code on line 33:
> >> *res_code = op;
> >>
> >> I think it would be a better idea to make op2 iterate over same set
> >> of operators (op2->substitutes = op->substitutes).
> >> I have attached patch for the same.
> >> Bootstrap + testing in progress on x86_64-unknown-linux-gnu.
> >> OK for trunk after bootstrap+testing completes ?
> >
> > Hmm, but then the example could as well just use 'op'.  I think we
> > should instead reject this.
> >
> > Consider
> >
> >   (for op (plus minus)
> >     (for op2 (op)
> >       (simplify ...
> >
> > where it is not clear what would be desired.  Simple replacement
> > of 'op's value would again just mean you could have used 'op' in
> > the first place.  Doing what you propose would get you
> >
> >   (for op (plus minus)
> >     (for op2 (plus minus)
> >       (simplify ...
> >
> > thus a different iteration.
> >
> >> I wonder if we really need is_oper_list flag in user_id ?
> >> We can determine if user_id is an operator list
> >> if user_id::substitutes is not empty ?
> >
> > After your change yes.
> >
> >> That will lose the ability to distinguish between user-defined operator
> >> list and list-iterator in for like op/op2, but I suppose we (so far) don't
> >> need to distinguish between them ?
> >
> > Well, your change would simply make each list-iterator a (temporary)
> > user-defined operator list as well as the current iterator element
> > (dependent on context - see the nested for example).  I think that
> > adds to confusion.
> >
> > So - can you instead reject this use?
> Well my intention was to have support for walking operator list in reverse.
> For eg:
> (for bitop (bit_and bit_ior)
>       rbitop (bit_ior bit_and)
>    ...)
> Could be replaced by sth like:
> (for bitop (bit_and bit_ior)
>       rbitop (~bitop))
>    ...)
> 
> where "~bitop" would indicate walking (bit_and bit_ior) in reverse.
> Would that be a good idea ? For symmetry, I thought
> (for op (list)
>       op2 (op))
> should be supported too.

Hmm, but is this really a useful extension?  To me it just complicates
the syntax for the occasional reader.

Richard.

> 
> Thanks,
> Prathamesh
> 
> 
> >
> > Thanks,
> > Richard.
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Dilip Upmanyu, Graham 
Norton, HRB 21284 (AG Nuernberg)

Reply via email to