On Wed, Jun 11, 2014 at 11:35 PM, DJ Delorie <d...@redhat.com> wrote: > > If the combined bitfields are exactly the size of the mode, the logic > for detecting range overflow is flawed - it calculates an ending > "position" that's the position of the first bit in the next field. > > In the case of "short" for example, you get "16 > 15" without this > patch (comparing size to position), and "15 > 15" with (comparing > position to position). > > Ok to apply?
Looks ok to me, but can you add a testcase please? Also check if 4.9 is affected. Thanks, Richard. > * expmed.c (strict_volatile_bitfield_p): Fix off-by-one error. > > Index: expmed.c > =================================================================== > --- expmed.c (revision 211479) > +++ expmed.c (working copy) > @@ -472,13 +472,13 @@ strict_volatile_bitfield_p (rtx op0, uns > && bitnum % GET_MODE_ALIGNMENT (fieldmode) + bitsize > modesize)) > return false; > > /* Check for cases where the C++ memory model applies. */ > if (bitregion_end != 0 > && (bitnum - bitnum % modesize < bitregion_start > - || bitnum - bitnum % modesize + modesize > bitregion_end)) > + || bitnum - bitnum % modesize + modesize - 1 > bitregion_end)) > return false; > > return true; > } > > /* Return true if OP is a memory and if a bitfield of size BITSIZE at