<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - using known return value of std functions"
   href="https://bugs.llvm.org/show_bug.cgi?id=47266">47266</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>using known return value of std functions
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>-New Bugs
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>linux@rasmusvillemoes.dk
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>htmldeveloper@gmail.com, llvm-bugs@lists.llvm.org, neeilans@live.com, richard-llvm@metafoo.co.uk
          </td>
        </tr></table>
      <p>
        <div>
        <pre>There's something a bit wonky about clang's use of e.g. memcpy() being known to
return its dst argument. Both gcc and clang does seem to know this, and in fact
both compilers seem to compile

  memcpy(p, q, y);
  do_stuff(p, 5);

to exactly the same thing as when one writes this as

  do_stuff(memcpy(p, q, y), 5);

The weird thing is that clang decides to use a callee-saved register for p,
even in the latter case; that's even more pronounced on ppc where the return
register is also the first argument register. Godbolt:
<a href="https://godbolt.org/z/W6W3od">https://godbolt.org/z/W6W3od</a>

In the powerpc case, all the instruction involving r30 could be elided. Similar
for x86. And clearly clang must know about the semantics of the return value,
or it couldn't possibly compile the second one with referring to eax.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>