<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 - improve code density of sparse switch statements"
   href="https://bugs.llvm.org/show_bug.cgi?id=39013">39013</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>improve code density of sparse switch statements
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>new-bugs
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>7.0
          </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>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>slandden@gmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>A sparse switch statement use a bitmap and popcnt to improve code density.

Code:
int switchexample(unsigned char num) {
   switch(num) {
   case 0:
        return 123;
   case 2:
        return 123;
   case 4:
        return 123;
   case 6:
        return 123;
   case 8:
        return 123;
   case 10:
        return 123;
   case 12:
        return 123;
   case 14:
        return 123;
   case 16:
        return 123;
   case 18:
        return 123;
   case 20:
        return 123;
   case 22:
        return 123;
   case 24:
        return 123;
   case 139: // The compiler gives up on using a jump table at 140
        return 123;
   }
}

Generated ASM:

switchexample(unsigned char):                     # @switchexample(unsigned
char)
        push    rbp
        mov     rbp, rsp
        mov     al, dil
        mov     byte ptr [rbp - 5], al
        movzx   edi, byte ptr [rbp - 5]
        mov     ecx, edi
        mov     rdx, rcx
        sub     rdx, 139
        mov     qword ptr [rbp - 16], rcx # 8-byte Spill
        mov     qword ptr [rbp - 24], rdx # 8-byte Spill
        ja      .LBB0_15
        mov     rax, qword ptr [rbp - 16] # 8-byte Reload
        mov     rcx, qword ptr [8*rax + .LJTI0_0]
        jmp     rcx
.LBB0_1:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_2:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_3:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_4:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_5:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_6:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_7:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_8:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_9:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_10:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_11:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_12:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_13:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_14:
        mov     dword ptr [rbp - 4], 123
        jmp     .LBB0_16
.LBB0_15:
        ud2
.LBB0_16:
        mov     eax, dword ptr [rbp - 4]
        pop     rbp
        ret
.LJTI0_0:
        .quad   .LBB0_1
        .quad   .LBB0_15
        .quad   .LBB0_2
        .quad   .LBB0_15
        .quad   .LBB0_3
        .quad   .LBB0_15
        .quad   .LBB0_4
        .quad   .LBB0_15
        .quad   .LBB0_5
        .quad   .LBB0_15
        .quad   .LBB0_6
        .quad   .LBB0_15
        .quad   .LBB0_7
        .quad   .LBB0_15
        .quad   .LBB0_8
        .quad   .LBB0_15
        .quad   .LBB0_9
        .quad   .LBB0_15
        .quad   .LBB0_10
        .quad   .LBB0_15
        .quad   .LBB0_11
        .quad   .LBB0_15
        .quad   .LBB0_12
        .quad   .LBB0_15
        .quad   .LBB0_13
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_15
        .quad   .LBB0_14</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>