public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Palmer Dabbelt <palmer@dabbelt.com>
To: gcc-patches@gcc.gnu.org
Cc: jeffreyalaw@gmail.com, cmuellner@gcc.gnu.org,
	Vineet Gupta <vineetg@rivosinc.com>,
	kito.cheng@sifive.com, gnu-toolchain@rivosinc.com,
	philipp.tomsich@vrull.eu, christoph.muellner@vrull.eu
Subject: Re: [PATCH v2 00/10] [RISC-V] Atomics improvements [PR100265/PR100266]
Date: Fri, 14 Oct 2022 17:31:09 -0700 (PDT)	[thread overview]
Message-ID: <mhng-d3708184-1762-4676-a5fa-3938ad748041@palmer-ri-x1c9a> (raw)
In-Reply-To: <mhng-580bc331-c4d5-4f04-afd5-30f09f68b660@palmer-ri-x1c9a>

On Fri, 14 Oct 2022 14:57:22 PDT (-0700), Palmer Dabbelt wrote:
> On Fri, 14 Oct 2022 13:39:33 PDT (-0700), jeffreyalaw@gmail.com wrote:
>>
>> On 10/14/22 05:03, Christoph Müllner wrote:
>>>
>>> My guess is people like the ISA mapping (more) because it has been 
>>> documented and reviewed.
>>> And it is the product of a working group that worked out the 
>>> RVWMO specification.
>>> This gives some confidence that we don't need to rework it massively 
>>> because of correctness issues in the future.
>>
>> This stuff can be hard and if someone with deep experience in memory 
>> models has reviewed the ISA mapping, then I'd prefer it over the GCC 
>> mapping.   It's just more likely the experts in the memory model space 
>> are more likely to get it right than a bunch of compiler junkies, no 
>> matter how smart we think we are :-)
>
> That's not really proven the case for the ISA suggested Linux mappings.  
> We've been through a bunch of rounds of review upstream and that's 
> resulted in some differences.  Some of that is likely related to the ISA 
> mappings for Linux being incomplete (they punt on the tricky bits like 
> interactions with spinlocks, which filter all over the place), and Linux 
> doesn't have the same old binary compatibility issues (aka the in-kernel 
> ABI is not stable between releases) so mapping churn isn't nearly as 
> scary over there.
>
> Still not much of an argument in favor of the GCC mappings, though.  I'm 
> pretty sure nobody with a formal memory model backgound has looked at 
> those, which is pretty much the worst spot to be in.  That said, I don't 
> think we can just say the ISA mappings are the way to go, they seem to 
> suffer from some similar incompleteness issues (for example, there's no 
> explicit mappings for std::atomic<T>::compare_exchange_{weak,strong}).  
> So we'll still need to put in the work to make sure whatever mappings 
> get implemented are correct.
>
> [
> As an aside, I think LLVM is doing the wrong thing for some of the more 
> complex forms of compare_exchange_weak.  For example
>
>     #include <atomic>
>     
>     bool f(std::atomic<long>& p, long& o, long n) {
>         return p.compare_exchange_weak(o, n, std::memory_order_acq_rel, std::memory_order_release);

Eric points out this is bogus code, the spec forbids release as the fail 
ordering (which akes sense).  Just kind of randomly permutating these 
ordering arguments ends up with some generated code that seems off, for 
example release/acq_rel produces lr/sc.rl (and no fences).

I don't think any of that is very relevant for the GCC discussion, 
though, as there's a bunch of other mappings specified by the ISA and we 
should just sort this one out.

>     }
>     
>    
>     $ clang-15.0.0 -std=c++17 -O3
>     f(std::atomic<long>&, long&, long):                   # @f(std::atomic<long>&, long&, long)
>             ld      a4, 0(a1)
>     .LBB0_3:                                # =>This Inner Loop Header: Depth=1
>             lr.d.aq a3, (a0)
>             bne     a3, a4, .LBB0_5
>             sc.d.rl a5, a2, (a0)
>             bnez    a5, .LBB0_3
>     .LBB0_5:
>             xor     a0, a3, a4
>             seqz    a0, a0
>             beq     a3, a4, .LBB0_2
>             sd      a3, 0(a1)
>     .LBB0_2:
>             ret
>
> doesn't look to me like it provides release ordering on failure, but I'm 
> not really a memory model person so maybe I'm missing something here.  
> The GCC mapping is pretty ugly, but I think we do happen to have correct 
> behavior in this case:
>
>     # gcc-12.2.0 -std=c++17 -O3
>     f(std::atomic<long>&, long&, long):
>             ld      a5,0(a1)
>             fence iorw,ow;  1: lr.d.aq a4,0(a0); bne a4,a5,1f; sc.d.aq a3,a2,0(a0); bnez a3,1b; 1:
>             sub     a5,a4,a5
>             seqz    a0,a5
>             beq     a5,zero,.L2
>             sd      a4,0(a1)
>     .L2:
>             andi    a0,a0,1
>             ret
> ]
>
>> Maybe I'm being too optimistic, but it's not hard for me to see a path 
>> where GCC and LLVM both implement the ISA mapping by default.  Anything 
>> else is just a path of long term pain.
>
> I'd bet that most people want that, but in practice building any real 
> systems in RISC-V land requires some degree of implementation-defined 
> behavior as the specifications don't cover everything (even ignoring the 
> whole PDF vs specification word games).  That's not to say we should 
> just ignore what's written down, just that there's more work to do even 
> if we ignore compatibility with old binaries.
>
> I think the question here is whether it's worth putting in the extra 
> work to provide a path for systems with old binaries to gradually 
> upgrade to the ISA mappings, or if we just toss out those old binaries.  
> I think we really need to see how bunch of a headache that compatibility 
> mode is going to be, and the only way to do that is put in the time to 
> analyze the GCC mappings.
>
> That said, I don't really personally care that much about old binaries.  
> Really my only argument here is that we broke binary compatibility once 
> (right before we upstreamed the port), that made a handful of people 
> mad, and I told them we'd never do it again.  I think we were all 
> operating under the assumption that RISC-V would move an order of 
> magnitude faster that it has, though, so maybe we're in a spot where 
> nobody actually cares about extant binaries and we can just throw them 
> all out.
>
> If we're going to do that, though, there's a bunch of other cruft that 
> we should probably toss along with the GCC mappings...
>
>>
>>
>> Jeff
>
> -- 
> You received this message because you are subscribed to the Google Groups "gnu-toolchain" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to gnu-toolchain+unsubscribe@rivosinc.com.
> To view this discussion on the web visit https://groups.google.com/a/rivosinc.com/d/msgid/gnu-toolchain/mhng-580bc331-c4d5-4f04-afd5-30f09f68b660%40palmer-ri-x1c9a.
> For more options, visit https://groups.google.com/a/rivosinc.com/d/optout.

  reply	other threads:[~2022-10-15  0:31 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-05 19:36 Christoph Muellner
2021-05-05 19:36 ` [PATCH v2 01/10] RISC-V: Simplify memory model code [PR 100265] Christoph Muellner
2021-05-05 19:36 ` [PATCH v2 02/10] RISC-V: Emit proper memory ordering suffixes for AMOs " Christoph Muellner
2021-05-05 19:36 ` [PATCH v2 03/10] RISC-V: Eliminate %F specifier from riscv_print_operand() " Christoph Muellner
2021-05-05 19:36 ` [PATCH v2 04/10] RISC-V: Use STORE instead of AMOSWAP for atomic stores " Christoph Muellner
2021-05-05 19:36 ` [PATCH v2 05/10] RISC-V: Emit fences according to chosen memory model " Christoph Muellner
2021-05-05 19:36 ` [PATCH v2 06/10] RISC-V: Implement atomic_{load,store} " Christoph Muellner
2021-05-05 19:36 ` [PATCH v2 07/10] RISC-V: Model INSNs for LR and SC [PR 100266] Christoph Muellner
2021-05-05 19:36 ` [PATCH v2 08/10] RISC-V: Add s.ext-consuming " Christoph Muellner
2021-05-05 19:36 ` [PATCH v2 09/10] RISC-V: Provide programmatic implementation of CAS " Christoph Muellner
2021-05-06  0:27   ` Jim Wilson
2021-05-05 19:36 ` [PATCH v2 10/10] RISC-V: Introduce predicate "riscv_sync_memory_operand" " Christoph Muellner
2022-10-11 19:06 ` [PATCH v2 00/10] [RISC-V] Atomics improvements [PR100265/PR100266] Vineet Gupta
2022-10-11 19:31   ` Palmer Dabbelt
2022-10-11 20:46     ` Christoph Müllner
2022-10-11 23:31       ` Vineet Gupta
2022-10-12  0:15         ` Palmer Dabbelt
2022-10-12  8:03           ` Christoph Müllner
2022-10-13 23:11             ` Jeff Law
2022-10-12 17:16           ` Andrea Parri
2022-10-20 19:01             ` Andrea Parri
2022-10-29  5:02               ` Jeff Law
2022-10-13 23:04           ` Jeff Law
2022-10-13 22:39         ` Jeff Law
2022-10-13 23:14           ` Palmer Dabbelt
2022-10-14 11:03             ` Christoph Müllner
2022-10-14 20:39               ` Jeff Law
2022-10-14 21:57                 ` Palmer Dabbelt
2022-10-15  0:31                   ` Palmer Dabbelt [this message]
2022-10-14  0:14           ` Vineet Gupta
2022-10-11 23:14     ` Jeff Law

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=mhng-d3708184-1762-4676-a5fa-3938ad748041@palmer-ri-x1c9a \
    --to=palmer@dabbelt.com \
    --cc=christoph.muellner@vrull.eu \
    --cc=cmuellner@gcc.gnu.org \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=gnu-toolchain@rivosinc.com \
    --cc=jeffreyalaw@gmail.com \
    --cc=kito.cheng@sifive.com \
    --cc=philipp.tomsich@vrull.eu \
    --cc=vineetg@rivosinc.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).