http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48790
Summary: ARM GCC divide/modulo bug Product: gcc Version: 4.3.3 Status: UNCONFIRMED Severity: major Priority: P3 Component: c AssignedTo: unassig...@gcc.gnu.org ReportedBy: the.me...@gmail.com I've found a strange gcc bug in the Sourcery G++ Lite 2009q1-203. Invalid instruction is generated while executing this code: len = 9; width = 8; if ((len % width) == 0) printf("fail\n"); else printf("ok\n"); Strange is that if the code was in main, sometimes it passed throught without any problems, but when I've put the code into function it always fails to compute 9 modulo 8. I don’t see anything wrong in assembly generated by gcc (maybe there is some stack handling problem in the __aeabi_idivmod function) Any ideas what's wrong with the toolchain's gcc would really help... This is how the assembly looks like (of the testcase function) testcase: .fnstart .LFB2: @ args = 0, pretend = 0, frame = 16 @ frame_needed = 1, uses_anonymous_args = 0 stmfd sp!, {fp, lr} .save {fp, lr} .LCFI0: .setfp fp, sp, #4 add fp, sp, #4 .LCFI1: .pad #16 sub sp, sp, #16 .LCFI2: str r0, [fp, #-8] str r1, [fp, #-12] ldr r3, [fp, #-8] mov r0, r3 ldr r1, [fp, #-12] bl __aeabi_idivmod mov r3, r1 cmp r3, #0 bne .L2 ldr r0, .L6 bl puts b .L5 .L2: ldr r0, .L6+4 bl puts .L5: sub sp, fp, #4 ldmfd sp!, {fp, pc} .L7: .align 2 .L6: .word .LC0 .word .LC1 .LFE2: .fnend Full Test example for reproducing the bug (Should write 2 ok into screen, but it generates Illegal Instruction instead: #include <stdio.h> int testcase(int len, int width) { /* This generates Illegal instruction (always) */ if ((len % width) == 0) printf("fail\n"); else printf("ok\n"); } int main(int argc, char *argv[]) { int len, width; len = 9; width = 8; /* This generates Illegal instruction (sometimes ???) */ if ((len % width) == 0) printf("fail\n"); else printf("ok\n"); testcase(len, width); return 0; } # arm-none-linux-gnueabi-gcc-4.3.3 --v Using built-in specs. Target: arm-none-linux-gnueabi Configured with: /scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/src/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --with-specs='%{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables}' --enable-languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2009q1-203' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/libc --with-gmp=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/obj/host-libs-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/obj/host-libs-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/bin Thread model: posix gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203)