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.