From: "Christoph Müllner" <christoph.muellner@vrull.eu>
To: Jeff Law <jeffreyalaw@gmail.com>
Cc: gcc-patches@gcc.gnu.org, Kito Cheng <kito.cheng@sifive.com>,
Jim Wilson <jim.wilson.gcc@gmail.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Andrew Waterman <andrew@sifive.com>,
Philipp Tomsich <philipp.tomsich@vrull.eu>,
Vineet Gupta <vineetg@rivosinc.com>
Subject: Re: [PATCH 7/7] riscv: Add support for str(n)cmp inline expansion
Date: Mon, 14 Nov 2022 22:49:29 +0100 [thread overview]
Message-ID: <CAEg0e7gkYBc8-tONaD0TwEhLL-NyvPEcgBaD-8qsmyUPNNA0YA@mail.gmail.com> (raw)
In-Reply-To: <7b26ef79-50c7-b4df-f0a7-e2fd40767d8d@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 3872 bytes --]
On Mon, Nov 14, 2022 at 8:28 PM Jeff Law <jeffreyalaw@gmail.com> wrote:
>
> On 11/13/22 16:05, Christoph Muellner wrote:
> > From: Christoph Müllner <christoph.muellner@vrull.eu>
> >
> > This patch implements expansions for the cmpstrsi and the cmpstrnsi
> > builtins using Zbb instructions (if available).
> > This allows to inline calls to strcmp() and strncmp().
> >
> > The expansion basically emits a peeled comparison sequence (i.e. a peeled
> > comparison loop) which compares XLEN bits per step if possible.
> >
> > The emitted sequence can be controlled, by setting the maximum number
> > of compared bytes (-mstring-compare-inline-limit).
> >
> > gcc/ChangeLog:
> >
> > * config/riscv/riscv-protos.h (riscv_expand_strn_compare): New
> > prototype.
> > * config/riscv/riscv-string.cc (GEN_EMIT_HELPER3): New helper
> > macros.
> > (GEN_EMIT_HELPER2): New helper macros.
> > (expand_strncmp_zbb_sequence): New function.
> > (riscv_emit_str_compare_zbb): New function.
> > (riscv_expand_strn_compare): New function.
> > * config/riscv/riscv.md (cmpstrnsi): Invoke expansion functions
> > for strn_compare.
> > (cmpstrsi): Invoke expansion functions for strn_compare.
> > * config/riscv/riscv.opt: Add new parameter
> > '-mstring-compare-inline-limit'.
>
> Presumably the hybrid inline + out of line approach is to capture the
> fact that most strings compare unequal early, then punt out to the
> library if they don't follow that model? It looks like we're structured
> for that case by peeling iterations rather than having a fully inlined
> approach. Just want to confirm...
>
Yes, this was inspired by gcc/config/rs6000/rs6000-string.cc
(e.g. expand_strncmp_gpr_sequence).
The current implementation emits an unrolled loop to process up to N
characters.
For longer strings, we do a handover to libc to process the remainder there.
The hand-over implies a call overhead and, of course, a well-optimized
str(n)cmp
implementation would be beneficial (once we have the information in user
space for ifuncs).
We can take this further, but then the following questions pop up:
* how much data processing per loop iteration?
* what about unaligned strings?
Happy to get suggestions/opinions for improvement.
> I was a bit worried about the "readahead" problem that arises when
> reading more than a byte and a NUL is found in the first string. If
> you're not careful, the readahead of the second string could fault. But
> it looks like we avoid that by requiring word alignment on both strings.
>
Yes, aligned strings are not affected by the readahead.
I wonder if we should add dynamic tests in case the compiler cannot derive
XLEN-alignment so we capture more cases (e.g. character-arrays have
guaranteed alignment 1, but are allocated with a higher actual alignment on
the stack).
> > +
> > +/* Emit a string comparison sequence using Zbb instruction.
> > +
> > + OPERANDS[0] is the target (result).
> > + OPERANDS[1] is the first source.
> > + OPERANDS[2] is the second source.
> > + If NO_LENGTH is zero, then:
> > + OPERANDS[3] is the length.
> > + OPERANDS[4] is the alignment in bytes.
> > + If NO_LENGTH is nonzero, then:
> > + OPERANDS[3] is the alignment in bytes.
>
> Ugh. I guess it's inevitable unless we want to drop the array and pass
> each element individually (in which case we'd pass a NULL_RTX in the
> case we don't have a length argument).
>
I will split the array into individual rtx arguments as suggested.
> I'd like to give others a chance to chime in here. Everything looks
> sensible here, but I may have missed something. So give the other
> maintainers a couple days to chime in before committing.
>
>
> Jeff
>
>
next prev parent reply other threads:[~2022-11-14 21:49 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-13 23:05 [PATCH 0/7] riscv: Improve builtins expansion Christoph Muellner
2022-11-13 23:05 ` [PATCH 1/7] riscv: bitmanip: add orc.b as an unspec Christoph Muellner
2022-11-14 16:51 ` Jeff Law
2022-11-14 17:53 ` Jeff Law
2022-11-14 19:05 ` Philipp Tomsich
2022-11-13 23:05 ` [PATCH 2/7] riscv: bitmanip/zbb: Add prefix/postfix and enable visiblity Christoph Muellner
2022-11-14 16:55 ` Jeff Law
2022-11-13 23:05 ` [PATCH 3/7] riscv: Enable overlap-by-pieces via tune param Christoph Muellner
2022-11-14 2:48 ` Vineet Gupta
2022-11-14 7:59 ` Philipp Tomsich
2022-11-14 8:29 ` Christoph Müllner
2022-11-14 19:04 ` Jeff Law
2022-11-14 19:07 ` Christoph Müllner
2022-11-13 23:05 ` [PATCH 4/7] riscv: Move riscv_block_move_loop to separate file Christoph Muellner
2022-11-14 16:56 ` Jeff Law
2022-11-13 23:05 ` [PATCH 5/7] riscv: Use by-pieces to do overlapping accesses in block_move_straight Christoph Muellner
2022-11-14 17:16 ` Jeff Law
2022-11-14 19:01 ` Christoph Müllner
2022-11-14 19:05 ` Jeff Law
2022-11-13 23:05 ` [PATCH 6/7] riscv: Add support for strlen inline expansion Christoph Muellner
2022-11-14 18:17 ` Jeff Law
2022-11-14 21:07 ` Christoph Müllner
2022-11-13 23:05 ` [PATCH 7/7] riscv: Add support for str(n)cmp " Christoph Muellner
2022-11-14 19:28 ` Jeff Law
2022-11-14 21:49 ` Christoph Müllner [this message]
2022-11-15 0:22 ` Jeff Law
2022-11-15 0:46 ` Kito Cheng
2022-11-15 0:53 ` Palmer Dabbelt
2022-11-15 1:55 ` Kito Cheng
2022-11-15 3:41 ` Jeff Law
2022-11-15 22:22 ` Christoph Müllner
2022-11-16 0:15 ` Philipp Tomsich
2022-11-21 3:24 ` Kito Cheng
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=CAEg0e7gkYBc8-tONaD0TwEhLL-NyvPEcgBaD-8qsmyUPNNA0YA@mail.gmail.com \
--to=christoph.muellner@vrull.eu \
--cc=andrew@sifive.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jeffreyalaw@gmail.com \
--cc=jim.wilson.gcc@gmail.com \
--cc=kito.cheng@sifive.com \
--cc=palmer@dabbelt.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).