[Bug c/80640] Missing memory side effect
amonakov at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri May 5 13:52:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80640
Alexander Monakov <amonakov at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|WAITING |UNCONFIRMED
Ever confirmed|1 |0
--- Comment #3 from Alexander Monakov <amonakov at gcc dot gnu.org> ---
The issue boils down to just
void f(int *p)
{
while (*p)
__atomic_thread_fence(2);
}
which with -O2 -fno-tree-ter is compiled to
f:
movl (%rdi), %eax # *p_3(D), _4
.L6:
testl %eax, %eax # _4
jne .L6 #,
rep ret
the .optimized dump looks as expected, but then __atomic_thread_fence(2) is
expanded into nothing, so the load is hoisted during RTL transforms.
Note that the source declares opal_list_next as
volatile struct opal_list_item_t *opal_list_next;
but the 'volatile' qualifier applies to the pointed-to struct, not the field
itself. If written as
volatile struct opal_list_item_t *volatile opal_list_next;
then the problematic hoisting does not happen.
More information about the Gcc-bugs
mailing list