[LLVMbugs] [Bug 10062] New: llvm doesn't merge masked loads

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Wed Jun 1 15:38:06 PDT 2011


           Summary: llvm doesn't merge masked loads
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: Scalar Optimizations
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: nlewycky at google.com
                CC: llvmbugs at cs.uiuc.edu, scshunt at csclub.uwaterloo.ca

This is related to bug 5039 but is specifically concerned with cases where LLVM
should be able to merge the loads/tests across multiple fields. A patch in
development would put this sort of optimizable logic in clang's hot path, so we
took a look at what sort of code LLVM would generate for it. Testcase:

  struct Foo {
    unsigned char foo : 5;
    unsigned char bar : 3;

  int test1(struct Foo foo) {
    // should be a single comparison
    return foo.foo == 3 && foo.bar == 3;

  int test2(struct Foo foo) {
    // should be a single comparison
    return foo.foo != 0 || foo.bar != 0;

  int test3(struct Foo foo) {
    // should be a single cast
    return foo.bar + (foo.foo << 3);

test1 has an entire branch which looks like the same problem as bug 10054.
test2 and test3 are straight-line code with no optimization opportunities taken
advantage of.

For reference, GCC 4.6 produces:

        xorl    %eax, %eax
        cmpb    $99, %dil
        sete    %al

        xorl    %eax, %eax
        testb   %dil, %dil
        setne   %al

        movl    %edi, %eax
        andl    $31, %edi
        shrb    $5, %al
        movzbl  %al, %eax
        leal    (%rax,%rdi,8), %eax

with a missed optimization in test3.

Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

More information about the llvm-bugs mailing list