https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66090
Bug ID: 66090
Summary: Wrong loop code generation with -O2 on ARM
Product: gcc
Version: 4.9.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: [email protected]
Target Milestone: ---
test.c:
void func()
{
unsigned int i;
unsigned int *ptr = (unsigned int*)0xfffff000;
for (i = 0; i < 1024; i++)
*(ptr++) = 0;
}
Compiled with GCC 4.9.2 from the Xubuntu 15.04 repository:
arm-linux-gnueabihf-gcc-4.9 -marm -c -O2 test.c
Generated code:
00000000 <func>:
func():
0: e3a03a0f mov r3, #61440 ; 0xf000
4: e3a02000 mov r2, #0
8: e34f3fff movt r3, #65535 ; 0xffff
c: e4832004 str r2, [r3], #4
10: eafffffd b c <func+0xc>
There is no check of the loop exit condition.
When compiling with -O1, it is there:
00000000 <func>:
func():
0: e3a03a0f mov r3, #61440 ; 0xf000
4: e34f3fff movt r3, #65535 ; 0xffff
8: e3a02000 mov r2, #0
c: e4832004 str r2, [r3], #4
10: e3530000 cmp r3, #0
14: 1afffffc bne c <func+0xc>
18: e12fff1e bx lr
The problem does not occur with GCC 4.8.4.