https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91869

            Bug ID: 91869
           Summary: Constant bitfield assignment causes unnecessary use of
                    memory and instructions
           Product: gcc
           Version: 9.2.1
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pdj at knaldgas dot dk
  Target Milestone: ---
              Host: x86_64
            Target: x86_64
             Build: x86_64

Created attachment 46914
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46914&action=edit
MWE in C, compile with gcc -O2

Assigning constant bitfields to variables cause unnecessary use of memory,
instructions and time.

Having a byte consisting of multiple bitfields, setting more than one bitfield
causes gcc to place the constant in .rodata instead of immediate loading.
When all fields are zero, or setting only one of the bitfields, immediate
loading is used as expected.

On microcontrollers with limited memory this is a problem. Bitfields
(representation clauses) in Ada are well-defined, but I've written the MWE in C
as C's bitfields exhibit the same (mis-)behaviour.

The attached code should be generated with:
$ gcc -O2 main.c -o main
$ objdump -h -S main > main.lss

Tried with Targets being x86_64 (9.2.1), arm-linux-gnueabihf (9.2.1) and avr
(9.2.0), same result.

Reply via email to