https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111623

            Bug ID: 111623
           Summary: __sync_synchronize compiler barrier not honored (rv64)
           Product: gcc
           Version: 11.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rehn at rivosinc dot com
  Target Milestone: ---

Hi,

In openjdk rv64 port we see code moved over __sync_synchronize, only one case
found.
We have:
__synch_synchronize()
__atomic_compare_exchange(...)
__synch_synchronize()

We see additional code moved between those two fences:

ld      a4,0(a1)
lw      a2,8(a1)
fence
sub     a5,s6,a4
srl     a5,a5,a2
sext.w  a5,a5
beqz    s1,1d0 <.L1^B143> // <=== should not be here ?
sub     a4,s1,a4
srl     a4,a4,a2
lr.w    a2,(s2)
bne     a2,a4,8a <.L1^B142> // a4 not sign extended ?
sc.w    a0,a5,(s2)
bnez    a0,7c <.L1^B141>
sext.w  a5,a2
fence

We notice this because the the compare value was not sign extended. (4 byte
cmpxchg)
While looking at how that could be, we notice additional code in this critical
section.
Compare value loaded with ld but never sign extended before lr.w/sc.w.

Fixing the code motions issue by addition a explicit compiler barrier (volatile
asm memory clobber), or by using __atomic_thread_fence(__ATOMIC_SEQ_CST)
instead: both issues goes away.
If there is two bugs, or one bugs causing collateral effects we don't know.

I don't have a simple reproducer, and seems very specific.
The templated code is expanded for every garbage collector, and only one GC see
this issue. (even if there is some kind bad code there, compiler barrier should
still be respected IMHO)

openjdk bug: https://bugs.openjdk.org/browse/JDK-8316566

issue that found this: https://github.com/openjdk/jdk/pull/15715
code to reproduce: https://github.com/robehn/jdk/tree/for-gcc-sync/ (sorry
again for no simpler way)

gcc 12/13 do not have this issue, it seems to be in 11 and 10 at least.

Due to limit on attachments:
https://github.com/robehn/jdk/tree/for-gcc-sync/gcc-bug-info
(contains the unsafe.ii, command line, and additional snippets)

No clue which component this should be, but c++ front end is most likely wrong
:)

Thanks, Robbin

Reply via email to