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

--- Comment #4 from Andrew Waterman <andrew at sifive dot com> ---
Correction: Appendix A recommends lr.w.aqrl + sc.w.rl.
https://github.com/riscv/riscv-isa-manual/blob/9ec8c0105dbf1492b57f6cafdb90a268628f476a/src/memory.tex#L1150-L1152

On Mon, Mar 7, 2022 at 3:51 PM Andrew Waterman <and...@sifive.com> wrote:
>
> Appendix A of the RISC-V ISA manual says that lr.w.aq + sc.w.aqrl
> should suffice.  I see the patch puts aqrl on both the load and store,
> which, while correct, appears to be stronger than necessary.
>
> (cc Dan Lustig)
>
>
> On Mon, Mar 7, 2022 at 3:25 PM patrick at rivosinc dot com via
> Gcc-bugs <gcc-bugs@gcc.gnu.org> wrote:
> >
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104831
> >
> >             Bug ID: 104831
> >            Summary: RISCV libatomic LR.aq/SC.rl pair insufficient for
> >                     SEQ_CST
> >            Product: gcc
> >            Version: 12.0
> >             Status: UNCONFIRMED
> >           Severity: normal
> >           Priority: P3
> >          Component: target
> >           Assignee: unassigned at gcc dot gnu.org
> >           Reporter: patrick at rivosinc dot com
> >   Target Milestone: ---
> >
> > Currently, libatomic's _sync_fetch_and_#op# and
> > __sync_val_compare_and_swap methods are not sufficiently strong for the
> > ATOMIC_SEQ_CST memory model.
> >
> > This can be shown using the following herd litmus test:
> > RISCV LRSC-LIB-CALL
> >
> > (*
> >   Current LR/SC pair as implemented in libatomic library call
> > *)
> >
> > {
> > 0:x6=a; 0:x8=b; 0:x10=c;
> > 1:x6=a; 1:x8=b; 1:x10=c;
> > }
> >
> >  P0                  | P1           ;
> >  ori x1,x0,1         | lw x9,0(x10) ;
> >  sw x1,0(x10)        | fence rw,rw  ;
> >  lr.w.aq x7,0(x8)    | lw x5,0(x6)  ;
> >  ori x7,x0,1         |              ;
> >  sc.w.rl x3,x7,0(x8) |              ;
> >  sw x1,0(x6)         |              ;
> >
> > ~exists (1:x9=1 /\ 1:x5=0 /\ b=1)

Reply via email to