This is with gcc 3.3.6 for arm-linux with fixes for bugs 22528 & 16201 patched in.
I've run into a c file where gcc produces a ldr with too large of an offset for load: {standard input}:26675: Error: bad immediate value for offset (4100) At first this looked like bug 10730 or bug 16201 however 10730 is fixed in 3.3.6 and I've added the patch for arm_eliminable_register() provided in 16201. I'm still seeing the issue. asm line 26675 is on c line 3689 which pre-processes to the following: { sessdata->Identity.Session.v.uint32value = SN_BEGINNING_SESSION_FALSE; { sn_aaa_session_data_open_t *open; ; (sessdata)->Identity.Session.valid = 1; (sessdata)->Identity.Session.set = 1; open = (sn_aaa_session_data_open_t *)((sessdata)->open); if (open) { sn_aaa_attr_record_t *attr; attr = (sn_aaa_attr_record_t*)((sessdata)->Identity.Session.internal); ; { ; ; if (!((open)->valid_cache[(attr)->id])) { (open)->valid_cache[(attr)->id] = 1; (open)->valid[(open)->next_valid] = (attr); (open)->next_valid++; } }; open->set[open->next_set] = attr; open->next_set++; } }; }; parts of the compiled output are below: .L3680: .align 2 .L3679: .word _GLOBAL_OFFSET_TABLE_-(.L3408+8) <<<<< SNIP >>>>> .word 15292 .word 12612 .word 10444 <---- offset 532 .loc 1 3167 0 .L3590: <<<<< SNIP >>>>> .loc 1 3689 0 .LBB1666: ldr r3, .L3679+532 <---- line 26675 .LBE1666: mov r1, #0 ldr r2, .L3681+208 .LBB1667: ldr ip, [r6, r3] ldr r3, .L3681+212 mov r4, #1 cmp ip, #0 .LBE1667: str r1, [r6, r3] ldr r3, .L3681+216 .LBB1668: strb r4, [r6, r2] strb r4, [r6, r3] beq .L2385 ldr r3, .L3681+220 .LBB1669: ldr r1, .L3681+324 ldr lr, [r6, r3] ldr r2, [lr, #0] add r2, r2, ip ldrb r3, [r2, r1] @ zero_extendqisi2 cmp r3, #0 bne .L2386 ldr r0, .L3681+328 strb r4, [r2, r1] ldr r2, .L3681+332 ldr r3, [ip, r0] add r1, r3, r4 add r3, ip, r3, asl #2 str lr, [r3, r2] str r1, [ip, r0] .L2386: ldr r1, .L3681+336 ldr r2, .L3681+340 ldr r3, [ip, r1] add r0, r3, #1 add r3, ip, r3, asl #2 str lr, [r3, r2] str r0, [ip, r1] .L2385: .loc 1 3693 0 It's probably just coincidence, but it only happens with these optimizations: arm-linux-gcc -mbig-endian -march=armv5te -mtune=xscale -Wa,-mcpu=xscale -O2 -g -pipe -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wparentheses -Wformat -Wreturn-type -fPIC -Wmissing-prototypes <<lots of -D and -I here>> -c thefile.c -o thefile.o An not these: arm-linux-gcc -mbig-endian -O2 -g -pipe -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wparentheses -Wformat -Wreturn-type -fPIC -Wmissing-prototypes <<lots of -D and -I here>> -c thefile.c -o thefile.o arm-linux-gcc -mbig-endian -O -g -pipe -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wparentheses -Wformat -Wreturn-type -fPIC -Wmissing-prototypes <<lots of -D and -I here>> -c thefile.c -o thefile.o arm-linux-gcc -mbig-endian -march=armv5te -mtune=xscale -Wa,-mcpu=xscale -O -g -pipe -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wparentheses -Wformat -Wreturn-type -fPIC -Wmissing-prototypes <<lots of -D and -I here>> -c thefile.c -o thefile.o -- Summary: Error: bad immediate value for offset (4100) Product: gcc Version: 3.3.6 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: djohnson+gcc at sw dot starentnetworks dot com GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: arm-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25190