<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=koi8-r">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"\0421\0442\0430\043D\0434\0430\0440\0442\043D\044B\0439 HTML \0417\043D\0430\043A";
        margin:0in;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTML
        {mso-style-name:"\0421\0442\0430\043D\0434\0430\0440\0442\043D\044B\0439 HTML \0417\043D\0430\043A";
        mso-style-priority:99;
        mso-style-link:"\0421\0442\0430\043D\0434\0430\0440\0442\043D\044B\0439 HTML";
        font-family:Consolas;}
span.EmailStyle22
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle23
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Our main motivation is to have an atomic variant of memcmp. We discussed extending the pattern matching and we may do it sometime later, but it’s not the first on our list.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Regarding non-standard signatures. I think it’d be worth to have an ‘isVolatile’ flag for non-atomic memcmp (like for memcpy). We cannot pass this flag to a lib function call, so your suggested approach with introducing new libfuncs wouldn’t
 work.<br>
Also introducing the memcmp intrinsic would make the code more consistent and clearer to understand. memcpy, memset, memmove already have intrinsics and we can share some intrinsics optimization. E.g., we could hoist memcpy and memcmp of invariant arrays out
 of the loop using a generalized code for memory intrinsics. <br>
<br>
Dmitry<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span lang="RU">От:</span></b><span lang="RU"> Philip Reames <listmail@philipreames.com>
<br>
<b>Отправлено:</b> Thursday, November 25, 2021 2:16 AM<br>
<b>Кому:</b> Dmitry Makogon <dmakogon@azul.com>; llvm-dev@lists.llvm.org<br>
<b>Тема:</b> Re: [llvm-dev] Proposal: Introduce memory comparison intrinsics<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p>Glancing at the in-tree usage, it looks like we have decent support for optimizing and lowering existing calls to bcmp/memcpy, but very little in the way of pattern matching formation.  Are you planning on extending the matching pieces?  Or is the primary
 intent to be able to share lowering code for the atomic invariants?<o:p></o:p></p>
<p>One thing I note is that glancing at existing code, it looks like not all targets support bcmp or memcmp.  Given that, any intrinsic formation is going to have to remain dependent on the appropriate TLI checks.  That's slightly odd, but not a show stopper. 
<o:p></o:p></p>
<p>I would find this proposal more compelling if you could show benefit to the existing lowering/transformations by introducing the non-standard signatures.  I don't see any obvious ways to do so, but maybe give that some thought?<o:p></o:p></p>
<p>The major alternative to this proposal would be to simply add two new libfuncs for the atomic variants of bcmp/memcpy, and then configure them to be not-present on most targets.  This would allow you to reuse the lowering code - which I do think is entirely
 reasonable for upstream - without the need for the intrinsics.<o:p></o:p></p>
<p>Overall, I think this proposal is reasonable.  I'm not strongly in support given the ease of the libfunc approach, but I don't really see any serious downsides to it either.<o:p></o:p></p>
<p>Philip<o:p></o:p></p>
<div>
<p class="MsoNormal">On 11/22/21 8:22 AM, Dmitry Makogon via llvm-dev wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Hello everyone.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">I would like to introduce new intrinsics for memory comparison:<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">memcmp - an equivalent of libc' memcmp,<o:p></o:p></p>
<p class="MsoNormal">bcmp - an equivalent of libc' bcmp,<o:p></o:p></p>
<p class="MsoNormal">memcmp.element.unordered.atomic - an element atomic version of memcmp,<o:p></o:p></p>
<p class="MsoNormal">bcmp.element.unordered.atomic - an element atomic version of bcmp.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Currently there exist some optimizations for memcmp/bcmp libc calls.<o:p></o:p></p>
<p class="MsoNormal">We would like to have these optimizations for element atomic comparisons (atomicity permitted).<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">I suggest we rewrite the existing optimizations to work with on new intrinsics and transform<o:p></o:p></p>
<p class="MsoNormal">memcmp/bcmp libc calls to the corresponding intrinsics. This is similar to what we do with<o:p></o:p></p>
<p class="MsoNormal">memcpy library calls.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Having these optimizations work on intrinsics and not on recognized libc calls<o:p></o:p></p>
<p class="MsoNormal">will allow us to share some existing transforms between atomic and non-atomic variants.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">I propose the following plan for introducing the new intrinsics:<o:p></o:p></p>
<p class="MsoNormal">1. Introduce non-atomic memcmp and bcmp intrinsics.<o:p></o:p></p>
<p class="MsoNormal">2. Reimplement existing transforms for non-atomic memcmp intrinsic,<o:p></o:p></p>
<p class="MsoNormal">the same way as it's done for memcpy.<o:p></o:p></p>
<p class="MsoNormal">3. Introduce atomic intrinsics and reuse the optimizations.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Please express your concerns about this.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Dmitry<o:p></o:p></p>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<pre>_______________________________________________<o:p></o:p></pre>
<pre>LLVM Developers mailing list<o:p></o:p></pre>
<pre><a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><o:p></o:p></pre>
<pre><a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><o:p></o:p></pre>
</blockquote>
</div>
</body>
</html>