This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Continue strict-volatile-bitfields fixes


On Fri, Feb 17, 2012 at 9:51 PM, Thomas Schwinge
<thomas@codesourcery.com> wrote:
> Hi!
>
> How do we move this issue forward?
>
> On Mon, 23 Jan 2012 15:46:34 +0100, Bernd Schmidt <bernds@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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]