[Bug tree-optimization/43565] Missed address comparison folding of DECL_COMMONs
marc@nieper-wisskirchen.de
gcc-bugzilla@gcc.gnu.org
Sat Feb 2 18:19:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43565
--- Comment #11 from Marc Nieper-Wißkirchen <marc@nieper-wisskirchen.de> ---
If ISO C allows such linkage to be created outside of the standard, a number of
other assumption would be violated as well:
In 6.2.4 (2) it says that "an object exists, has a constant address, and
retains its last-stored value throughout its lifetime."
Only "in the case of a volatile object, the last store need not be explicit in
the program" (footnote 34).
So what about making the external creation of linkage between two different
identifiers an error/undefined behavior if they are not declared volatile?
Firstly, not marking them volatile already already causes gcc to make wrong
assumptions (because it does not know about external aliasing):
extern int p;
extern int q;
int foo ()
{
p = 1;
q = 2;
return p;
}
This program compiles at "-O2" to:
foo:
movl $1, p(%rip)
movl $1, %eax
movl $2, q(%rip)
ret
Secondly, not marking them volatile would then allow the compiler to assume
that the addresses of p and q are different (because aliasing the two
identifiers would cause undefined behavior).
More information about the Gcc-bugs
mailing list