<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 --- - bitfields result in really slow code"
   href="http://llvm.org/bugs/show_bug.cgi?id=21039">21039</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>bitfields result in really slow code
          </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>jeroen.dobbelaere@synopsys.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=13070" name="attach_13070" title="test_bitfields.c: the testcase">attachment 13070</a> <a href="attachment.cgi?id=13070&action=edit" title="test_bitfields.c: the testcase">[details]</a></span>
test_bitfields.c: the testcase

Clang produces code that treats a bitfield as a part of a very large number,
consisting of all adjacent bitfields.
For structs containing a lot of bitfields, this can result in code loading,
storing and doing arithmetic operations on large numbers.

In the provided test example, we clear one specific bitfield.
On the x86/x86_64 architecture, this result in good code, but on all the other
architectures that I tried, the code results in unnecessary load/store
operations.

The problem seems to be that in the legalization and lowering phase, the
loading/masking/storing is split up in smaller chunks, but corresponding
load/stores are not optimized away. For x86, this is less of an issue as it
already knows how to map arithmetic operations onto memory.

Note: maybe the bigger problem is that clang maps bitfields onto such large
numbers in the first place ?</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>