This code: # 1 "fs.c" # 1 "<built-in>" # 1 "<command line>" # 1 "fs.c"
int foo(unsigned int bar) { unsigned int mask = bar & 0x80000001; if (mask & 0x80000000) mask = 0x80000000; return mask; } produces incorrect assembly code with -Os or -O2: .file "fs.c" .text .align 2 .global foo .type foo, %function foo: @ Function supports interworking. @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. cmp r0, #0 andge r0, r0, #-2147483648 <== should be -2147483647 movlt r0, #-2147483648 @ lr needed for prologue bx lr .size foo, .-foo .ident "GCC: (GNU) 4.1.2" *** Command line: arm-v4t-linux-gnueabi -save-temps -O2 fs.c *** Output: Using built-in specs. Target: arm-v4t-linux-gnueabi Configured with: /home/alarsen/projects/toolchain/OSELAS.Toolchain-1.1.1/build-cross/gcc-4.1.2/configure --host=i686-host-linux-gnu --target=arm-v4t-linux-gnueabi --prefix=/opt/OSELAS.Toolchain-1.1.1/arm-v4t-linux-gnueabi/gcc-4.1.2-glibc-2.5-kernel-2.6.18 --with-sysroot=/opt/OSELAS.Toolchain-1.1.1/arm-v4t-linux-gnueabi/gcc-4.1.2-glibc-2.5-kernel-2.6.18/sysroot-arm-v4t-linux-gnueabi --with-arch=armv4t --with-float=soft --with-fpu=vfp --disable-nls --disable-multilib --enable-symvers=gnu --enable-__cxa_atexit --enable-shared --enable-threads=posix --enable-languages=c,c++ --enable-c99 --enable-long-long Thread model: posix gcc version 4.1.2 /opt/OSELAS.Toolchain-1.1.1/arm-v4t-linux-gnueabi/gcc-4.1.2-glibc-2.5-kernel-2.6.18/libexec/gcc/arm-v4t-linux-gnueabi/4.1.2/cc1 -E -quiet -v fs.c -march=armv4t -mfloat-abi=soft -mfpu=vfp -O2 -fpch-preprocess -o fs.i ignoring nonexistent directory "/opt/OSELAS.Toolchain-1.1.1/arm-v4t-linux-gnueabi/gcc-4.1.2-glibc-2.5-kernel-2.6.18/sysroot-arm-v4t-linux-gnueabi/usr/local/include" #include "..." search starts here: #include <...> search starts here: /opt/OSELAS.Toolchain-1.1.1/arm-v4t-linux-gnueabi/gcc-4.1.2-glibc-2.5-kernel-2.6.18/lib/gcc/arm-v4t-linux-gnueabi/4.1.2/include /opt/OSELAS.Toolchain-1.1.1/arm-v4t-linux-gnueabi/gcc-4.1.2-glibc-2.5-kernel-2.6.18/lib/gcc/arm-v4t-linux-gnueabi/4.1.2/../../../../arm-v4t-linux-gnueabi/include /opt/OSELAS.Toolchain-1.1.1/arm-v4t-linux-gnueabi/gcc-4.1.2-glibc-2.5-kernel-2.6.18/sysroot-arm-v4t-linux-gnueabi/usr/include End of search list. /opt/OSELAS.Toolchain-1.1.1/arm-v4t-linux-gnueabi/gcc-4.1.2-glibc-2.5-kernel-2.6.18/libexec/gcc/arm-v4t-linux-gnueabi/4.1.2/cc1 -fpreprocessed fs.i -quiet -dumpbase fs.c -march=armv4t -mfloat-abi=soft -mfpu=vfp -auxbase fs -O2 -version -o fs.s GNU C version 4.1.2 (arm-v4t-linux-gnueabi) compiled by GNU C version 4.2.4 (Ubuntu 4.2.4-1ubuntu3). GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 2befb21690236570f62e4f3b11d6068c -- Summary: [ARM] Incorrect optimized code >= -O2 Product: gcc Version: 4.1.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: al at alarsen dot net GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: arm-v4t-linux-gnueabi http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40128