Bug 8013

Summary: writing all bitfields in a word
Product: gcc Reporter: jreiser
Component: rtl-optimizationAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED DUPLICATE    
Severity: enhancement CC: gcc-bugs
Priority: P3 Keywords: missed-optimization
Version: 3.2   
Target Milestone: ---   
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed: 2003-11-08 23:31:54
Attachments: bitfield.i

Description jreiser 2002-09-23 15:36:00 UTC
There is an opportunity for improved optimization when writing all the bitfields in a word ('int', 'unsigned', or 'long'): construct the entire word result in a register, then perform only one store to memory, instead of writing the fields to memory separately in turn.

The attached bitfield.i generates (with "-O" optimization)
        movl    (%ebx), %ecx
        andl    $16777215, %ecx
        movl    (%edx), %eax
        andl    $-16777216, %eax
        orl     %ecx, %eax
        movl    %eax, (%edx)
        movzbl  3(%ebx), %ecx
        andb    $127, %cl
        movzbl  3(%edx), %eax
        andb    $-128, %al
        orb     %cl, %al
        orb     $-128, %al
        movb    %al, 3(%edx)
which could be improved to
        movl    (%ebx), %eax
        orl     $1<<31, %eax
        movl    %eax, (%edx)
which is much shorter and faster.

Release:
gcc version 3.2

Environment:
Reading specs from /usr/local/gcc-3.2/lib/gcc-lib/i686-pc-linux-gnu/3.2/specs
Configured with: ../gcc-3.2/configure --prefix=/usr/local/gcc-3.2
Thread model: posix
gcc version 3.2

How-To-Repeat:
gcc -v -save-temps -O -S bitfield.c
Comment 1 Andrew Pinski 2003-05-24 19:46:45 UTC
confirmed that it still happends on mainline (20030524).
Comment 2 Andrew Pinski 2003-12-26 02:22:17 UTC
This is a dup of bug 336.

*** This bug has been marked as a duplicate of 336 ***