https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96594
Bug ID: 96594
Summary: Compiled code behaves differently with -O1 and -O0 on
s390x
Product: gcc
Version: 10.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: mitya57 at gmail dot com
Target Milestone: ---
Created attachment 49050
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=49050&action=edit
Test case
Hi,
I was debugging Compiz test failures that started happening on Debian/Ubuntu
s390x in July. They are not directly related to GCC upgrade (old GCC 8 behaves
the same way), however I noticed a strange thing that I want to report here.
The attached file behaves differently when built with -O0 and -O1:
$ g++ test.cpp -g -O1 -lX11
$ xvfb-run ./a.out
setting value = 0x1020304
got value = 0xffffffff
$ g++ test.cpp -g -O0 -lX11
$ xvfb-run ./a.out
setting value = 0x1020304
got value = 0x0
And both these behaviors are wrong! Expected behavior is (as seen on x86_64):
$ xvfb-run ./a.out
setting value = 0x1020304
got value = 0x1020304
However, this bug is about differing behaviors with -O1 and -O0.
The only dependency of this file is Xlib. So far I was not able to make an
example that does not depend on it.
I wanted to bisect a particular optimization that causes this behavior change,
but even with all options from
https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-O1 it behaves
like -O0.
Some more things I noticed:
- Moving GetProperty and SetProperty functions away from the namespace makes it
behave like -O0.
- Adding __attribute__((noinline)) to SetProperty makes it behave like -O0. So
the bug may be related to inlining.
I am also attaching assembly dumps with -O1 and -O0.