On Fri, Feb 17, 2012 at 9:51 PM, Thomas Schwinge <tho...@codesourcery.com> wrote: > Hi! > > How do we move this issue forward? > > On Mon, 23 Jan 2012 15:46:34 +0100, Bernd Schmidt <ber...@codesourcery.com> > wrote: >> On 11/29/2011 05:35 PM, Mitchell, Mark wrote: >> >>> So, I still think this patch is the best way to go forward, and it >> >> does >> >>> fix incorrect code generation. Would appreciate an OK. >> >> >> >> Ping. >> > >> > If you don't hear any objections within a week, please proceed. >> >> That was committed a while ago. The part in stor-layout.c that stops us >> from promoting bitfields to normal fields apparently caused some >> testsuite regressions in sh tests, where some optimization dump scans >> show that we can't perform the optimizations if there are BIT_FIELD_REFs >> rather than a normal member access. >> >> The testcases use things like >> enum something field:8; >> and I think applying strict-volatile-bitfields to enums is probably >> meaningless. Should we adjust semantics so that the compiler is free to >> optimize enum bitfields? The patch would look something like the below. >> Thomas has tested this on arm and sh with our internal tree. >> >> >> Bernd >> >> >> Index: gcc/stor-layout.c >> =================================================================== >> --- gcc/stor-layout.c (revision 355696) >> +++ gcc/stor-layout.c (working copy) >> @@ -665,8 +665,7 @@ >> may make a volatile object later. */ >> if (TYPE_SIZE (type) != 0 >> && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST >> - && GET_MODE_CLASS (TYPE_MODE (type)) == MODE_INT >> - && flag_strict_volatile_bitfields <= 0) >> + && GET_MODE_CLASS (TYPE_MODE (type)) == MODE_INT) >> { >> enum machine_mode xmode >> = mode_for_size_tree (DECL_SIZE (decl), MODE_INT, 1); >> @@ -674,7 +673,12 @@ >> >> if (xmode != BLKmode >> && !(xalign > BITS_PER_UNIT && DECL_PACKED (decl)) >> - && (known_align == 0 || known_align >= xalign)) >> + && (known_align == 0 || known_align >= xalign) >> + && (flag_strict_volatile_bitfields <= 0 >> + /* Same size makes strict volatile bitfields >> meaningless. */ >> + || GET_MODE_SIZE (xmode) == GET_MODE_SIZE >> (TYPE_MODE (type)) >> + /* Strict volatile bitfields shouldn't apply to >> enums. */ >> + || TREE_CODE (type) == ENUMERAL_TYPE))
What about BOOLEAN_TYPE bitfields? Thus, why not explicitely spell out && TREE_CODE (type) == INTEGER_TYPE? >> { >> DECL_ALIGN (decl) = MAX (xalign, DECL_ALIGN (decl)); >> DECL_MODE (decl) = xmode; >> > > > Grüße, > Thomas