The following C function: typedef struct {
unsigned x : 1, y : 1, z : 1, a : 3, b : 18, c : 5; } FOO; extern volatile FOO var; void bar( void ) { FOO x; x.x = 1; x.y = 0; x.z = 1; x.a = 0; x.b = 55; x.c = 0; var = x; } static const FOO y = { 1,0,1,0,55,0 }; void baz( void ) { var = y; } when compiled with -Os, -O2 or -O3 generates a very short function for bar(): ldr r3, .L3 ldr r2, .L3+4 str r2, [r3, #0] bx lr .align 2 .L3: .word var .word 3525 but a rather long one for baz: ldr r3, .L7 ldr r2, [r3, #0] orr r2, r2, #1 str r2, [r3, #0] ldr r2, [r3, #0] bic r2, r2, #2 str r2, [r3, #0] ldr r2, [r3, #0] orr r2, r2, #4 str r2, [r3, #0] ldr r2, [r3, #0] bic r2, r2, #56 str r2, [r3, #0] ldr r2, [r3, #0] bic r2, r2, #16711680 bic r2, r2, #61952 orr r2, r2, #3520 str r2, [r3, #0] ldr r2, [r3, #0] bic r2, r2, #520093696 str r2, [r3, #0] bx lr .align 2 .L7: .word var It seems that when the compiler sees that 'y' is a constant, it generates a sequence of individual field loads for structure members for a temporary structure (just like what bar() does), but then it does not run the optimizer over the generated sequence. -- Summary: Bitfield optimisation problem Product: gcc Version: 4.4.1 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: zoltan at bendor dot com dot au GCC host triplet: i586-gnu-linux GCC target triplet: arm-elf-none http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43003