Hi,
On Mon, 9 Dec 2013 14:18:23, Richard Biener wrote: > > On Mon, Dec 9, 2013 at 1:39 PM, Bernd Edlinger > <bernd.edlin...@hotmail.de> wrote: >> On Fri, 6 Dec 2013 11:51:15, Richard Biener wrote: >>> >>> On Fri, Dec 6, 2013 at 11:15 AM, Bernd Edlinger >>> <bernd.edlin...@hotmail.de> wrote: >>>> Hi, >>>> >>>> On Thu, 5 Dec 2013 15:10:51, Richard Biener wrote: >>>>> >>>>> On Thu, Dec 5, 2013 at 1:27 PM, Bernd Edlinger >>>>> <bernd.edlin...@hotmail.de> wrote: >>>>>> Hi Richard, >>>>>> >>>>>> I had just an idea how to solve that recursion problem without >>>>>> completely ignoring the >>>>>> memory mode. I hope you are gonna like it. >>>>>> >>>>>> This time I even added a comment :-) >>>>> >>>>> Ehm, ... >>>>> >>>>> + /* If MODE has no size i.e. BLKmode or is larger than WORD_MODE >>>>> + or BITREGION_END is used we can use WORD_MODE as upper limit. >>>>> + However, if the field is too unaligned to be fetched with a single >>>>> + access, we also have to use WORD_MODE. This can happen in Ada. */ >>>>> if (GET_MODE_BITSIZE (mode) == 0 >>>>> - || GET_MODE_BITSIZE (mode)> GET_MODE_BITSIZE (word_mode)) >>>>> + || GET_MODE_BITSIZE (mode)> GET_MODE_BITSIZE (word_mode) >>>>> + || bitregion_end != 0 >>>>> + || bitnum % BITS_PER_UNIT + bitsize> GET_MODE_SIZE (mode) >>>>> + || (STRICT_ALIGNMENT >>>>> + && bitnum % GET_MODE_ALIGNMENT (mode) + bitsize >>>>> +> GET_MODE_BITSIZE (mode))) >>>>> mode = word_mode; >>>>> >>>>> If the field is unaligned how does choosing a larger mode help? We should >>>>> always be able to use multiple accesses with a smaller mode in this case. >>>>> >>>>> So - I'd buy the || bitregion_end != 0 thing but the rest ...? So, ok if >>>>> that alone fixes the bug. Note that when bitregion_end == 0 the >>>>> access should be limited by the mode we pass to get_best_mode. >>>>> >>>>> Btw, it should be always possible to return QImode here, so I wonder >>>>> how enlarging the mode fixes the underlying issue (maybe the bug >>>>> is really elsewhere?) >>>>> >>>> >>>> This comment in store_split_bit_field explains everything: >>>> >>>> /* THISSIZE must not overrun a word boundary. Otherwise, >>>> store_fixed_bit_field will call us again, and we will mutually >>>> recurse forever. */ >>>> thissize = MIN (bitsize - bitsdone, BITS_PER_WORD); >>>> thissize = MIN (thissize, unit - thispos); >>>> >>>> >>>> This comment was added in 1993. At that time the code in >>>> store_fixed_bit_field >>>> looked like this: >>>> >>>> mode = get_best_mode (bitsize, bitnum, bitregion_start, bitregion_end, >>>> MEM_ALIGN (op0), word_mode, MEM_VOLATILE_P (op0)); >>>> if (mode == VOIDmode) >>>> { >>>> /* The only way this should occur is if the field spans word >>>> boundaries. */ >>>> store_split_bit_field (op0, bitsize, bitnum, bitregion_start, >>>> bitregion_end, value); >>>> return; >>>> } >>>> >>>> And in 2001 that was changed to this: >>>> >>>> mode = GET_MODE (op0); >>>> if (GET_MODE_BITSIZE (mode) == 0 >>>> || GET_MODE_BITSIZE (mode)> GET_MODE_BITSIZE (word_mode)) >>>> mode = word_mode; >>>> mode = get_best_mode (bitsize, bitnum, bitregion_start, bitregion_end, >>>> MEM_ALIGN (op0), mode, MEM_VOLATILE_P (op0)); >>>> >>>> Which broke the symmetry, and invalidated the above comment. >>>> Therefore we have again a recursion problem. >>> >>> This was rev. 43864 btw, no testcase but added the comment >>> "We don't want a mode bigger than the destination". >>> >>> So isn't the bug fixed by calling your new store_fixed_bit_field_1 >>> from store_split_bit_field? In fact that caller knows the mode >>> it wants to do the store with, so why not even have an explicit >>> mode argument for store_fixed_bit_field_1 instead of extracting >>> it from op0? >>> >>> Note I just want to help as well and I am not very familiar with >>> the details of the implementation here. So I'd rather have >>> a patch "obviously correct" to me - which expanding a condition >>> by several more checks isn't ;) >>> >> >> Hmm... >> >> I think if I solve it from the other side, everything looks >> much more obvious indeed. >> >> How about this new version: For the inconsistent values, >> MODE = QImode, bitpos=11, bitsize=8, it just generates two >> QImode accesses now, instead of a single HI or SImode. >> >> Boot-strapped and regression-test passed on X86-linux-gnu. >> >> OK for trunk? > > Looks good to me. > > Thanks, > Richard. > Great! Then I think we can put all bits together now: 1. Let Sandra apply her Bit-fields patch "reimplement -fstrict-volatile-bitfields v4, part 1/2" which was posted here: http://gcc.gnu.org/ml/gcc-patches/2013-09/msg02058.html and approved here: http://gcc.gnu.org/ml/gcc-patches/2013-10/msg01476.html 2. As follow-Up I'd like to apply this update-patch, which fixes the recursion in the extract_split_bit_field and fixes the C++ memory model for -fstrict-volatile-bitfields: which was posted here: http://gcc.gnu.org/ml/gcc-patches/2013-11/msg02046.html and approved here: http://gcc.gnu.org/ml/gcc-patches/2013-12/msg00091.html 3. Then this patch itself "Strict volatile bit-fields clean-up, Take 2". 4. And finally the Clean-up patch: "Strict volatile bit-fields clean-up" which removes the dependencies on the variable flag_strict_volatile_bitfields from expand_assignment and expand_expr_real_1. And uses the access mode of the field instead of the structure mode. which was posted here: http://gcc.gnu.org/ml/gcc-patches/2013-11/msg02479.html and approved here: http://gcc.gnu.org/ml/gcc-patches/2013-12/msg00086.html Is that OK? Thanks Bernd.