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.

Reply via email to