Hi, Gentle ping.
Thanks, Soumya > On 4 Feb 2026, at 9:09 AM, Soumya AR <[email protected]> wrote: > > Hi, > > Gentle ping. > > Thanks, > Soumya > >> On 27 Jan 2026, at 10:32 AM, Soumya AR <[email protected]> wrote: >> >> Hi, >> >> Gentle ping. >> >> Thanks, >> Soumya >> >>> On 19 Jan 2026, at 9:53 PM, [email protected] wrote: >>> >>> External email: Use caution opening links or attachments >>> >>> >>> From: Soumya AR <[email protected]> >>> >>> Hi, >>> >>> The following are a revised set of patches that implement atomic fetch >>> min/max >>> in GCC. >>> >>> These have been revised based on discussions in this thread: >>> >>> https://gcc.gnu.org/pipermail/gcc-patches/2025-November/699602.html >>> >>> To summarize, we now define the following builtins: >>> - __atomic_fetch_min >>> - __atomic_fetch_max >>> - __atomic_min_fetch >>> - __atomic_max_fetch >>> >>> And resolve them to an internal function: IFN_ATOMIC_FETCH_MINMAX. >>> >>> If the backend does not support atomic fetch min/max operations, the IFN is >>> lowered to a compare-and-swap loop. Otherwise, it is expanded to >>> target-specific >>> optabs. >>> >>> ---- >>> >>> Following discussions with Jonathan here: >>> https://gcc.gnu.org/pipermail/gcc-patches/2026-January/706015.html >>> >>> I suppose implementing the op_fetch variants of the builtins is not >>> necessary. >>> If they are only used to support the libstdc++ operator overloading, then we >>> can get rid of them in the compiler if we have no use of exposing these. >>> >>> This would also help clean up a lot of extra-handling in place to ensure the >>> op_fetch variants of min/max are handled correctly. >>> >>> ---- >>> >>> Patch 2, ie. implementing the builtins in GCC via CAS lowering has had minor >>> modifications since v1 of it posted here: >>> >>> https://gcc.gnu.org/pipermail/gcc-patches/2025-November/700787.html >>> >>> Patch 3 and 4 further extend this interface to expand the IFN to atomic >>> min/max >>> optabs for aarch64. >>> >>> ---- >>> >>> Patch 5 adds a pass that pattern-matches CAS loops implementing fetch >>> min/max >>> to IFN_ATOMIC_FETCH_MINMAX. >>> >>> This pass turned out to be a lot more complex than I was expecting so >>> insights >>> into its implementation would really help. >>> >>> I don't expect this patch to go in at Stage 4, but putting it up for >>> feedback >>> nonetheless, if folks get the time to look at it. >>> >>> ---- >>> Soumya AR (5): >>> libstdc++: Implement std::atomic::fetch_min/max >>> middle-end: Add support for atomic fetch min/max builtins via CAS >>> lowering >>> expand: Expand IFN_ATOMIC_FETCH_MINMAX to target specific optabs >>> aarch64: Add backend support for atomic fetch min/max operations >>> middle-end: Pattern match CAS loops to IFN_ATOMIC_FETCH_MINMAX >>> >>> gcc/Makefile.in | 2 + >>> gcc/builtins.cc | 83 +- >>> gcc/builtins.h | 1 + >>> gcc/c-family/c-common.cc | 58 +- >>> gcc/config/aarch64/aarch64-protos.h | 4 + >>> gcc/config/aarch64/aarch64.cc | 51 ++ >>> gcc/config/aarch64/atomics.md | 54 +- >>> gcc/config/aarch64/iterators.md | 30 +- >>> gcc/expr.cc | 88 +- >>> gcc/ifn-atomic-minmax-lowering.cc | 402 +++++++++ >>> gcc/internal-fn.cc | 8 + >>> gcc/internal-fn.def | 1 + >>> gcc/optabs.cc | 133 +++ >>> gcc/optabs.def | 24 + >>> gcc/passes.def | 2 + >>> gcc/sync-builtins.def | 15 + >>> .../g++.dg/tree-ssa/cas-to-minmax-1.C | 23 + >>> .../g++.dg/tree-ssa/cas-to-minmax-2.C | 23 + >>> .../g++.dg/tree-ssa/cas-to-minmax-3.C | 21 + >>> .../g++.dg/tree-ssa/cas-to-minmax-4.C | 22 + >>> gcc/testsuite/gcc.dg/atomic-op-1.c | 353 ++++++++ >>> gcc/testsuite/gcc.dg/atomic-op-2.c | 353 ++++++++ >>> gcc/testsuite/gcc.dg/atomic-op-3.c | 353 ++++++++ >>> gcc/testsuite/gcc.dg/atomic-op-4.c | 353 ++++++++ >>> gcc/testsuite/gcc.dg/atomic-op-5.c | 355 ++++++++ >>> .../gcc.dg/tree-ssa/cas-to-minmax-1.c | 18 + >>> .../gcc.dg/tree-ssa/cas-to-minmax-2.c | 18 + >>> .../gcc.dg/tree-ssa/cas-to-minmax-3.c | 17 + >>> .../gcc.dg/tree-ssa/cas-to-minmax-4.c | 14 + >>> .../gcc.dg/tree-ssa/cas-to-minmax-5.c | 19 + >>> .../gcc.dg/tree-ssa/cas-to-minmax-6.c | 19 + >>> .../gcc.dg/tree-ssa/cas-to-minmax-run-1.c | 75 ++ >>> .../gcc.dg/tree-ssa/cas-to-minmax-run-2.c | 55 ++ >>> .../gcc.target/aarch64/atomic-minmax-lse.c | 122 +++ >>> .../gcc.target/aarch64/atomic-minmax-nolse.c | 196 +++++ >>> .../gcc.target/aarch64/atomic-minmax.c | 128 +++ >>> .../gcc.target/aarch64/atomic-minmax.x | 185 ++++ >>> gcc/tree-cas-to-minmax.cc | 801 ++++++++++++++++++ >>> gcc/tree-pass.h | 2 + >>> libgcc/config/aarch64/lse.S | 62 +- >>> libgcc/config/aarch64/t-lse | 3 +- >>> libstdc++-v3/include/bits/atomic_base.h | 132 ++- >>> libstdc++-v3/include/bits/version.def | 8 + >>> libstdc++-v3/include/bits/version.h | 10 + >>> libstdc++-v3/include/std/atomic | 57 ++ >>> libstdc++-v3/src/c++23/std.cc.in | 6 + >>> .../nonmembers_fetch_minmax.cc | 50 ++ >>> .../atomic_ref/integral_fetch_minmax.cc | 118 +++ >>> 48 files changed, 4823 insertions(+), 104 deletions(-) >>> create mode 100644 gcc/ifn-atomic-minmax-lowering.cc >>> create mode 100644 gcc/testsuite/g++.dg/tree-ssa/cas-to-minmax-1.C >>> create mode 100644 gcc/testsuite/g++.dg/tree-ssa/cas-to-minmax-2.C >>> create mode 100644 gcc/testsuite/g++.dg/tree-ssa/cas-to-minmax-3.C >>> create mode 100644 gcc/testsuite/g++.dg/tree-ssa/cas-to-minmax-4.C >>> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/cas-to-minmax-1.c >>> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/cas-to-minmax-2.c >>> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/cas-to-minmax-3.c >>> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/cas-to-minmax-4.c >>> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/cas-to-minmax-5.c >>> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/cas-to-minmax-6.c >>> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/cas-to-minmax-run-1.c >>> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/cas-to-minmax-run-2.c >>> create mode 100644 gcc/testsuite/gcc.target/aarch64/atomic-minmax-lse.c >>> create mode 100644 gcc/testsuite/gcc.target/aarch64/atomic-minmax-nolse.c >>> create mode 100644 gcc/testsuite/gcc.target/aarch64/atomic-minmax.c >>> create mode 100644 gcc/testsuite/gcc.target/aarch64/atomic-minmax.x >>> create mode 100644 gcc/tree-cas-to-minmax.cc >>> create mode 100644 >>> libstdc++-v3/testsuite/29_atomics/atomic_integral/nonmembers_fetch_minmax.cc >>> create mode 100644 >>> libstdc++-v3/testsuite/29_atomics/atomic_ref/integral_fetch_minmax.cc >>> >>> -- >>> 2.43.0 >>> >> >
