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: [email protected]
ReportedBy: [email protected]
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.