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

    <tr>
        <th>Summary</th>
        <td>
            suboptimal code for switch statement
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          bhaible
      </td>
    </tr>
</table>

<pre>
    In a `switch` statement with identical code in two branches, clang 20 (on x86_64) produces suboptimal code (with more conditional jumps than needed).

**How to reproduce:**
Save this file as foo.c:
```
int foo (int c)
{
  int p = 0;
  switch (c)
    {
    case 'c': case 's':
      p = 1;
      break;
    case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
    case 'a': case 'A':
      p = 1;
 break;
    }
  return p;
}
```
Run this command:
```
$ clang -O2 -c foo.c && objdump -d -r foo.o
```
Actual output:
```

foo.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <foo>:
   0:   31 c0                   xor    %eax,%eax
   2:   83 c7 bf add    $0xffffffbf,%edi
   5:   83 ff 32                cmp $0x32,%edi
   8:   77 15                   ja     1f <foo+0x1f>
   a:   48 b9 71 00 00 00 71    movabs $0x7100000071,%rcx
  11:   00 00 00 
  14:   48 0f a3 f9             bt     %rdi,%rcx
  18:   73 06                   jae 20 <foo+0x20>
  1a:   b8 01 00 00 00          mov    $0x1,%eax
  1f:   c3 ret
  20:   48 b9 00 00 00 00 04    movabs $0x4000400000000,%rcx
  27:   00 04 00 
  2a:   48 0f a3 f9             bt %rdi,%rcx
  2e:   72 ea                   jb     1a <foo+0x1a>
  30: eb ed                   jmp    1f <foo+0x1f>
```

Expected output:
```

foo.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <foo>:
   0:   31 c0 xor    %eax,%eax
   2:   83 c7 bf                add    $0xffffffbf,%edi
 5:   83 ff 32                cmp    $0x32,%edi
   8:   77 15 ja     1f <foo+0x1f>
   a:   48 b9 71 00 00 00 75    movabs $0x4007500000071,%rcx
  11:   00 04 00 
  14:   48 0f a3 f9             bt %rdi,%rcx
  18:   73 05                   jae    1f <foo+0x1f>
  1a: b8 01 00 00 00          mov    $0x1,%eax
  1f:   c3 ret
```

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMVs1u4zYQfhr6MrBBUn_WQQftJm57KtA-QMGfkc1UEgWRSrxvX1CUnETrJt2ihxIEJJLzjWa-mU-gcM6ce8SKZF9I9rATk7_YsZIXYWSLO2n1t-qXHgSQnLoX49WF5BScFx477D28GH8Bo7H3RokWlNUIpgf_YkGOolcXdIR_BdWK_gycAuFH28P1mP-Rp4SXMIxWTwoduEnawZtudUL4cfbd2RFB2V4bb2wvWniausGBv4geekSNmvDyQGgdJg_zZ_sC3sKIi2-SLAeE1r-LZwR_MQ4a0yIIB421BxVMaE1yukxam96HoxBGeFWEl8Gi-EJoDRC2BiDJA1CSxK1ITrBfbAEAVnsAJVzIqVCEFySpb2sX14sVLF7Z6jUMOaL483VjRTYbT6fNGjfrx836vFn_9C6SdVdsrOoP492ESoqH-W1EP409DPEk7r4l-7epj0VRtutEr78vB-Hp0kP7XznsVSwbEJ4TnoOVT3rqBthr2I_zkd3ga-Un0YKd_DD5O-5pHVFJTGtujsaOnfCAbZOn--sx3-fp0ma0fjBOOIedbL-BbcChCt0JB4_X1T2t6WYASb421pLk8cYgjV9MGCgK34-rHWceeYbiSvjX5WWG8gg9JqAKkA0IraNtSq_NPGSzQLSJkOwGaRpI-PZrqhsiPOEb4DECiwJYdifMJzE_WLNmyL_QK2tCojNcRHh6BFlCwYDSZRYs4Dr7LKSLny5Y5KpgMYRRxXQZiz5u0Lib3jzTBkQCTfkuMOlh4W_UZuNwzSkBmt_NCef_1WtCnK4JsSUheQT6Jpvb6OzzrRTsfdkCKwGqkqCKeYvTt_TcvIWZbulJKaXp2k_vE4o6hQW3MsTFpwzdY4fjwg4HFPfYkbHi4l3FxUpQMqeEElDfA3fD37fLRpaP1wGVR_0_l-6PCHUzPtXtP1Dtiv9YuP9eptmdPiyyz5Wa_ohSP1Pp_T8PfpRSFOp_IdO3LbfTVaLLpBQ7rFiRsWNeJBndXSqGPBcqz4uGp7IoMip0hkqUjGGOSap2puKUZ7SgBc3SktGDPGZ5WkqZ6pzphnKSUuyEaQ9t-9wd7HjeGecmrFha8KTctUJi6-a7Guc9vsB8SjgPV7exCqC9nM6OpLQ1zrtXN974FqvtJaux43pxuV3pdtPYVhfvBzdfnE6En87GXyZ5ULYj_BRcLo_9MNonVJ7w0xyII_y0RPpc8b8CAAD__wSSof8">