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

Reply via email to