<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/162832>162832</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Optimization regression after clang 17
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          alex-s168
      </td>
    </tr>
</table>

<pre>
    All clang versions on godbolt after 17.0.1 fail to optimize this lookup table into simple shift instructions

```c
typedef struct {
#define X(a) int x##a : 1;
    X(0) X(1) X(2) X(3)
    X(4) X(5) X(6) X(7)
    X(8) X(9) X(10) X(11)
#undef X
} bits;

int get(bits b, int idx) {
 switch(idx){
#define X(a) case a: return b.x##a; break;
    X(0) X(1) X(2) X(3)
    X(4) X(5) X(6) X(7)
    X(8) X(9) X(10) X(11)
#undef X
 default: __builtin_unreachable();
    }
}
```

with clang 17.0.1 `-target x86_64 -O3`:
```x86asm
get:
        mov     cl, 15
        sub cl, sil
        shl     edi, cl
        movsx   eax, di
        sar eax, 15
        ret
```

but later clang versions don't do this anymore, and instead emit a jump table, with a shift in each case

See: https://godbolt.org/z/c79q7EY4P
(I opened the opt pipeline viewer and noticed that the output of InstCombinerPass is different.
I don't have much knowledge about the internals of llvm tho.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMVM1u4zYQfhr6MohBUbIkH3Twbmogp12gl-0pGIkjixuKVMmR4-zTF5TsxNmi9xoCOJ75-HH-MUZzckSN2H0Ru8cNzjz40KCly0PMynrTev3WHKyFzqI7wZlCNN5F8A5OXrfeMmDPFCCrtnKbQY_GAnvwE5vR_CLgwUSw3r_MEzC2lsA49hDNOFmCOJiewbjIYe44MQt5SF8p168T8sBvE2nqYQWBqL4khMo19cYR_BCqRqH2iRguQuVC5QgiP0Am8gQFgAUkEygJ2U1QNyEXan-HLG763U0ob0L1GVnf9Pt38o9nshUrVD67FMCP9Kd6hNZwXF0T8pC8PhELVSc1tEJ9XSIx-pKI1mghvhruBqHqVf2fOegwEmAKPhDPwUG7vaVE5F-gDYQv_8OsgKYeZ8vJ8efndjaWjXueXSDshtQ1QiXOD89F9bgm875Z1oS-Gh6u7XptSlHKB8ZwIoZLXT6XBTx8yxM-_9Rrl7rEOAp5SOVYTHD9jf68nJ1N1cl2d6Y4t1d1NPZeP9jlJG2SsbOf6eIl2fCSbNrc38Nw0396JxD_O9R2ZrCYxu-38dTeCVUxaL8OILq30QdKrOj0MnCEGmg0DAg_5_E6nAmw5A_fRxNSCZa-Wt_8kyhVaWCeYsqSOgp1vO6CrQ8noY6_hDp21f7v6o-_iu9Lqesn8BM50sADpeUAk5nIptY9G3qlsLjlPJtuwSCvwJmnmcH38OQif_VjaxyF7xgjmAja9D0FcrwV8vD0HvOAZ4Jx7gZ4cf7Vkj4RYOvnldI4puDQxsRq7XkEHvx2o5tc7_M9bqjJqlLKfZXV5WZoihJ3WYYl7bAvCq2rnHqpiwLbuu4LKjemUVLtMpnJLNvlstwqynQrS5XvqwwzlKKQNKKx2_RYStDGxDhTk5WqztXGYks2LvtXqaWKQqm0ikOTLjy08ymKQloTOX5QsGFLzbd1yWJanBDoFCim8l838m0ENnOwzW_lMjzM7bbzo1DHRHo9Hqbgf1LHQh0XJ6NQx6uf50b9EwAA__9s1sif">