On Tue, 10 May 2011, Richard Guenther wrote:
> On Tue, 10 May 2011, Michael Matz wrote:
>
> > Hi,
> >
> > On Tue, 10 May 2011, Richard Guenther wrote:
> >
> > > struct B {
> > > unsigned bit0 : 1;
> > > unsigned bit1 : 1;
> > > };
> > >
> > > void
> > > foo (struct B *b)
> > > {
> > > b->bit0 = b->bit0 | b->bit1;
> > > }
> > >
> > > we with this patch generate
> > >
> > > D.2686_2 = b_1(D)->bit0;
> > > D.2688_4 = b_1(D)->bit1;
> > > D.2693_10 = D.2688_4 ^ D.2686_2;
> > > b_1(D)->bit0 = D.2693_10;
> >
> > I assume that this generates a XOR instead of an OR is a typo not a
> > feature of the patch ;-)
>
> Yes ;)
>
> > > + struct B {
> > > + unsigned bit0 : 1;
> > > + unsigned bit1 : 1;
> > > + };
> > > +
> > > + void
> > > + foo (struct B *b)
> > > + {
> > > + b->bit0 = b->bit0 | b->bit1;
> > > + }
> > > +
> > > + /* { dg-final { scan-tree-dump-not "\\\(unsigned char\\\)" "optimized"
> > > } } */
> >
> > Perhaps test for only '\\\(unsigned' ? Because I'm not sure if some
> > targets don't extend to "unsigned int", after all that's the base type of
> > the bitfields.
>
> It's what some of the premature FE optimization does, shortening
> the width of the operation. The C standard would have
> int (or unsigned int) conversions. So in reality no conversion at all
> should prevail, but I didn't want to try inventing a regexp for that ;)
>
> But yes, matching \\\(unsigned should be enough.
And I now get
FAIL: gcc.target/i386/pr45903.c scan-assembler-not shr[qdl]
because the optimization Jakub put in place relies on operations
carried out in smaller modes.
That's of course a conflict of interest. I'm going to sit on this
patch for a little longer.
Richard.