<html>
    <head>
      <base href="http://llvm.org/bugs/" />
    </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 --- - '*p++' uses an extra register"
   href="http://llvm.org/bugs/show_bug.cgi?id=22167">22167</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>'*p++' uses an extra register
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>libraries
          </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>normal
          </td>
        </tr>

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

        <tr>
          <th>Component</th>
          <td>Common Code Generator Code
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>paul_robinson@playstation.sony.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvmbugs@cs.uiuc.edu
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Created <span class=""><a href="attachment.cgi?id=13650" name="attach_13650" title="small.cpp">attachment 13650</a> <a href="attachment.cgi?id=13650&action=edit" title="small.cpp">[details]</a></span>
small.cpp

This is on x86-64 Linux, compiling at -O2.
The relevant bit from the source looks like this:

  while (1) {
    Op op = static_cast<Op>(*pData++);
    switch (op) {
    ...

Some cases in the switch will increment pData further, others don't.
The curious thing is that the generated code maintains copies of both
the un-incremented and post-incremented values of pData, basically
using two registers where one would be sufficient.  Ultimately this
requires a couple extra register-copy instructions to keep everything
sorted out.

I wouldn't be all that fussed, except having two copies of pData around
apparently causes debug info to get confused about which register has
the correct value in it, and sometimes the debug info claims pData is
not available when actually it is.</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>