Optimization on sample below creates a temporary pointer &buf[i] where data is written. However this pointer is not restored to &buf[0] when i is set to 0.
Occurs on 3.3.3 but not 2.95. I realize that 3.3 is really old, but it would be useful to know if this has already been fixed and if possible how to write code that avoids the problem. # 1 "t.c" # 1 "<built-in>" # 1 "<command line>" # 1 "t.c" int stdin = 1; typedef int servinfo_t; int fgetc(int fh) { static int idx = 0; if (idx++ < (2 * 8192)) { return (0); } else { return (-1); } } int nbsmtp_data_body(servinfo_t *serverinfo) { int c; int last = -1; int i = 0; char buf[8192]; for (;;) { c = fgetc(stdin); if ( c != -1 ) { if (i == (8192 -1)) { buf[i] = '\0'; i = 0; } buf[i++] = (char)c; if (i == (8192 -1)) { buf[i] = '\0'; i = 0; } last = c; } else { buf[i] = '\0'; break; } } return 1; } int main(int argc, char *argv[]) { servinfo_t dummy; nbsmtp_data_body(&dummy); return (0); } .L14: ldr r0, [r7, #0] bl fgetc cmn r0, #1 ldr r3, .L15+4 beq .L10 cmp r4, r3 moveq r4, r6 addeq r2, sp, #7936 add r4, r4, #1 streqb r6, [r2, #255] moveq r5, sp cmp r4, r3 strb r0, [r5], #1 addeq r3, sp, #7936 moveq r4, r6 <<<< Note "i" is updated but r5 is not streqb r6, [r3, #255] b .L14 [EMAIL PROTECTED]> gcc -v --save-temps -O2 -Wall t.c Reading specs from /import/arm/eldk31/usr/bin/../lib/gcc-lib/arm-linux/3.3.3/specs Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --with-newlib --enable-languages=c,c++ --disable-libgcj --host=i386-redhat-linux --target=arm-linux Thread model: posix gcc version 3.3.3 (DENX ELDK 3.1 3.3.3-8) /import/arm/eldk31/usr/bin/../lib/gcc-lib/arm-linux/3.3.3/cc1 -E -quiet -v -iprefix /import/arm/eldk31/usr/bin/../lib/gcc-lib/arm-linux/3.3.3/ -D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=3 -D__ARM_ARCH_4T__ t.c -mcpu=arm9 -Wall -O2 t.i ignoring nonexistent directory "/import/arm/eldk31/usr/arm-linux/sys-include" ignoring nonexistent directory "/import/arm/eldk31/usr/arm-linux/include" #include "..." search starts here: #include <...> search starts here: /import/arm/eldk31/usr/lib/gcc-lib/arm-linux/3.3.3/include /import/arm/eldk31/arm/usr/include End of search list. /import/arm/eldk31/usr/bin/../lib/gcc-lib/arm-linux/3.3.3/cc1 -fpreprocessed t.i -quiet -dumpbase t.c -mcpu=arm9 -auxbase t -O2 -Wall -version -o t.s GNU C version 3.3.3 (DENX ELDK 3.1 3.3.3-8) (arm-linux) compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.3 2.96-113). GGC heuristics: --param ggc-min-expand=63 --param ggc-min-heapsize=62917 /import/arm/eldk31/usr/bin/../lib/gcc-lib/arm-linux/3.3.3/../../../../arm-linux/bin/as -mcpu=arm9 -mfpu=softvfp -o t.o t.s /import/arm/eldk31/usr/bin/../lib/gcc-lib/arm-linux/3.3.3/collect2 -dynamic-linker /lib/ld-linux.so.2 -X -m armelf_linux -p /import/arm/eldk31/usr/../arm/usr/lib/crt1.o /import/arm/eldk31/usr/../arm/usr/lib/crti.o /import/arm/eldk31/usr/bin/../lib/gcc-lib/arm-linux/3.3.3/crtbegin.o -L/import/arm/eldk31/usr/bin/../lib/gcc-lib/arm-linux/3.3.3 -L/import/arm/eldk31/usr/bin/../lib/gcc-lib -L/import/arm/eldk31/usr/lib/gcc-lib/arm-linux/3.3.3 -L/import/arm/eldk31/usr/bin/../lib/gcc-lib/arm-linux/3.3.3/../../../../arm-linux/lib -L/import/arm/eldk31/usr/lib/gcc-lib/arm-linux/3.3.3/../../../../arm-linux/lib -L/import/arm/eldk31/usr/../arm/lib -L/import/arm/eldk31/usr/../arm/usr/lib t.o -lgcc -lc -lgcc /import/arm/eldk31/usr/bin/../lib/gcc-lib/arm-linux/3.3.3/crtend.o /import/arm/eldk31/usr/../arm/usr/lib/crtn.o -- Summary: -O2, -O3, -Os segment fault due to bad array index on ARM Product: gcc Version: 3.3.3 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: dadair at ariodata dot com GCC build triplet: i386-redhat-linux GCC host triplet: i386-redhat-linux GCC target triplet: arm-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26463