------- Comment #1 from pinskia at gmail dot com 2009-07-08 08:13 ------- Subject: Re: New: Optimizer handles loops with volatiles and post-incr. wrong
Sent from my iPhone On Jul 8, 2009, at 12:32 AM, "bastian dot schick at sciopta dot com" <gcc-bugzi...@gcc.gnu.org > wrote: > If the following code is compiled with -Os for ARM or ColdFire, the > exit > condition for the loop is removed. > Replacing *tbl++ with tbl[i] or using unsigned long instead of > volatile > unsigned long does not show the problem. > I suspect the post-increment optimization to be the problem, because > the > PowerPC version does not show the problem. > Also: Using a different start-address for tbl, does not show the > problem. It looks more like a wrapping issue. 4*64 = 256. So we go from -256u to 0 which causes wrapping of the pointer which is undefined and therefor I think gcc is doing the correct thing (If got my numbers correct). > > The problem has been reported also for 4.4.0. > > typedef volatile unsigned long __vu32; > void bs() > { > int i; > __vu32 *tbl = (__vu32 *)0xffffff00; > for(i = 0; i < 64; ++i){ > //-> tbl[i] = (__vu32)10; > *tbl++ = (__vu32)10; > } > } > Cmd-line: arm-none-eabi-gcc -S -Os t.c > Output: > .cpu arm7tdmi > .fpu softvfp > .eabi_attribute 20, 1 > .eabi_attribute 21, 1 > .eabi_attribute 23, 3 > .eabi_attribute 24, 1 > .eabi_attribute 25, 1 > .eabi_attribute 26, 1 > .eabi_attribute 30, 4 > .eabi_attribute 18, 4 > .file "t.c" > .text > .align 2 > .global bs > .type bs, %function > bs: > @ Function supports interworking. > @ args = 0, pretend = 0, frame = 0 > @ frame_needed = 0, uses_anonymous_args = 0 > @ link register save eliminated. > mvn r2, #255 > .L2: > mov r3, #10 > str r3, [r2], #4 > b .L2 > .size bs, .-bs > .ident "GCC: (Sourcery G++ Lite 2008q3-39) 4.3.2" > > > -- > Summary: Optimizer handles loops with volatiles and post- > incr. > wrong > Product: gcc > Version: 4.3.2 > Status: UNCONFIRMED > Severity: major > Priority: P3 > Component: rtl-optimization > AssignedTo: unassigned at gcc dot gnu dot org > ReportedBy: bastian dot schick at sciopta dot com > GCC build triplet: i686-pc-linux-gnu > GCC host triplet: i686-mingw32 > GCC target triplet: i686-mingw32 > > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40679 > -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40679