[libc-commits] [PATCH] D126768: [libc][mem*] Introduce Sized/Backends for new mem framework

Clement Courbet via Phabricator via libc-commits libc-commits at lists.llvm.org
Wed Jun 1 05:12:50 PDT 2022

courbet added a comment.

As a very high level, design comment, I would like to note that I think we should strive to get into a state where the lowering of a `SizedOp` is done via a instrinsic call for all operation type (right now, this is only the case for `memcpy`).

The idea is that there are currently two places where we know how to lower a memory operation: the `Backend`, and the compiler (through the `__builtin_memxxx_inline`). In the future, any improvement to the `Backend` will only impact the codegen for `memxxx`, but not the expansion of a `memxxx(p, q, constant_size)`. One way to ensure non-divergence between the `Backend` implementations and the builtins is to actually use the builtins for lowering (at least in the "normal", non-temporal case).

So eventually, all implementations should look like the one for `copy`:

   if constexpr (LLVM_LIBC_USE_BUILTIN_MEMXXX_INLINE && /*is normal*/) {
       // delegate optimized operation to compiler.
       __builtin_memxxx_inline(dst.ptr(), src.ptr(), Size);
     // Fancy c++ implementation.

This is especially true for `memcmp` (I'm not sure how much love the `ExpandMemcmp` pass has had wrt aarch64), and `memset` (for example, `__builtin_memset` does not currently know to use `zva`: https://godbolt.org/z/6noee3Y6c).

  rG LLVM Github Monorepo



More information about the libc-commits mailing list