http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46888
Summary: missed optimization of zero_extract with constant inputs Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization AssignedTo: unassig...@gcc.gnu.org ReportedBy: a...@gcc.gnu.org The compiler fails to do constant folding for bit fields, at least on ARM targets, and instead builds the constant at run time. Test case: struct bits { unsigned a:5; unsigned b:5; unsigned c:5; unsigned d:5; }; struct bits f (unsigned int a) { struct bits bits = {0,0,0,0}; bits.a = 1; bits.b = 2; bits.c = 3; bits.d = a; return bits; } Output, compiled for ARM with "-O2 -mcpu=cortex-a8 -mthumb": movs r2, #1 movs r3, #0 bfi r3, r2, #0, #5 movs r2, #2 bfi r3, r2, #5, #5 movs r2, #3 bfi r3, r2, #10, #5 bfi r3, r0, #15, #5 mov r0, r3 bx lr