http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52979

--- Comment #7 from Richard Guenther <rguenth at gcc dot gnu.org> 2012-04-24 
12:28:24 UTC ---
Btw, get_best_mode for

Breakpoint 6, get_best_mode (bitsize=6, bitpos=31, bitregion_start=0, 
    bitregion_end=39, align=128, largest_mode=DImode, volatilep=0)

happily returns DImode which has more than maxbits (40) bits of size.

I think the C++ memory model work was not sufficiently completed to
handle this case during expansion.

At least

  /* Find the narrowest integer mode that contains the bit field.  */
  for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
       mode = GET_MODE_WIDER_MODE (mode))
    {
      unit = GET_MODE_BITSIZE (mode);
      if (unit == GET_MODE_PRECISION (mode)
          && (bitpos % unit) + bitsize <= unit)
        break;
    }

is overly pessimistic in the (bitpos % unit) + bitsize <= unit check and
does not consider bitpos adjustments.

Reply via email to