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