<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">