http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54398

             Bug #: 54398
           Summary: Incorrect ARM assembly when building with
                    -fno-omit-frame-pointer -O2
    Classification: Unclassified
           Product: gcc
           Version: 4.6.4
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: other
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: asha...@gcc.gnu.org


Created attachment 28096
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28096
Reduced test case

Please see the attached cpp and h files.

I used gcc-4.6.4 at 19788:190734 (as reported by svnversion -c).

Configured it as follows:

configure --disable-multilib --prefix=/usr
--bindir=/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.6.4
--datadir=/usr/share/gcc-data/armv7a-cros-linux-gnueabi/4.6.4
--mandir=/usr/share/gcc-data/armv7a-cros-linux-gnueabi/4.6.4/man
--infodir=/usr/share/gcc-data/armv7a-cros-linux-gnueabi/4.6.4/info
--includedir=/usr/lib/gcc/armv7a-cros-linux-gnueabi/4.6.4/include
--with-gxx-include-dir=/usr/lib/gcc/armv7a-cros-linux-gnueabi/4.6.4/include/g++-v4
--host=x86_64-pc-linux-gnu --target=armv7a-cros-linux-gnueabi
--build=x86_64-pc-linux-gnu --enable-languages=c,c++ --with-float=hard
--with-mode=thumb --with-sysroot=/usr/armv7a-cros-linux-gnueabi
--disable-libmudflap --disable-libssp --enable-libgomp --enable-__cxa_atexit
--enable-checking=release --disable-libquadmath --with-arch=armv7-a
--disable-esp --enable-linker-build-id

Built my file as follows:

g++ -fno-exceptions -Wno-unused-parameter -Wno-missing-field-initializers
-D_FILE_OFFSET_BITS=64 -fvisibility=hidden -pipe -fPIC -fno-strict-aliasing -g
-mthumb -Wa,-mimplicit-it=thumb -march=armv7-a -mtune=cortex-a8
-mfloat-abi=hard -mfpu=neon -O2 -fno-ident -fdata-sections -ffunction-sections
-fno-rtti -fno-threadsafe-statics -fvisibility-inlines-hidden -Wsign-compare
-Wno-invalid-offsetof -Wno-multichar -Wno-sign-compare -Wno-abi -O2 -pipe
-march=armv7-a -mtune=cortex-a15 -mfpu=neon -mfloat-abi=hard -g
-fno-omit-frame-pointer -o reduced.out reduced.cpp

The final binary is called reduced.out, and produces different output at -O0
and -O2 with -fno-omit-frame-pointer.

At -O0 (as well as for x86 backend):

p1.x 0
p1.y 0
p2.x 5
p2.y 5
p3.x 10
p3.y 10
p1.x 4
p1.y 4
p2.x 7
p2.y 7
p3.x 10
p3.y 10
p1.x 0
p1.y 0
p2.x 2
p2.y 2
p3.x 4
p3.y 4

At -fno-omit-frame-pointer -O2:

p1.x 0
p1.y 0
p2.x 5
p2.y 5
p3.x 10
p3.y 10
p1.x 4
p1.y 4
p2.x 777508
p2.y 7
p3.x 10
p3.y 10
p1.x 0
p1.y 0
p2.x 777492
p2.y 79193
p3.x 4
p3.y 4


In the assembly, I see:

 7a6:   6139            str     r1, [r7, #16] # Note non-0-offset from r7
 7a8:   f8c7 9014       str.w   r9, [r7, #20] # Note non-0-offset from r7
 7ac:   e893 0003       ldmia.w r3, {r0, r1}
 7b0:   e884 0003       stmia.w r4, {r0, r1}
 7b4:   e897 0003       ldmia.w r7, {r0, r1} # Note 0-offset from r7
 7b8:   e88c 0003       stmia.w ip, {r0, r1}

The two offsets should match otherwise we are using garbage values.

Reply via email to