<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/98223>98223</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
clang generating compare-branch for a large switch statement
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
appujee
</td>
</tr>
</table>
<pre>
It makes sense for a couple of cases but this one has a dozen case statements and I wonder why clang assumes that jump table is better?
```cpp
#include<cstring>
#include<wctype.h>
enum {
WC_TYPE_INVALID = 0,
WC_TYPE_ALNUM,
WC_TYPE_ALPHA,
WC_TYPE_BLANK,
WC_TYPE_CNTRL,
WC_TYPE_DIGIT,
WC_TYPE_GRAPH,
WC_TYPE_LOWER,
WC_TYPE_PRINT,
WC_TYPE_PUNCT,
WC_TYPE_SPACE,
WC_TYPE_UPPER,
WC_TYPE_XDIGIT,
WC_TYPE_MAX
};
int iswctype(wint_t wc, wctype_t char_class) {
switch (char_class) {
case WC_TYPE_ALNUM: return iswalnum(wc);
case WC_TYPE_ALPHA: return iswalpha(wc);
case WC_TYPE_BLANK: return iswblank(wc);
case WC_TYPE_CNTRL: return iswcntrl(wc);
case WC_TYPE_DIGIT: return iswdigit(wc);
case WC_TYPE_GRAPH: return iswgraph(wc);
case WC_TYPE_LOWER: return iswlower(wc);
case WC_TYPE_PRINT: return iswprint(wc);
case WC_TYPE_PUNCT: return iswpunct(wc);
case WC_TYPE_SPACE: return iswspace(wc);
case WC_TYPE_UPPER: return iswupper(wc);
case WC_TYPE_XDIGIT: return iswxdigit(wc);
default: return 0;
}
}
```
https://godbolt.org/z/jzx33W9Mx
```asm
iswctype: // @iswctype
cmp x1, #6
b.gt .LBB0_6
cmp x1, #3
b.gt .LBB0_11
cmp x1, #1
b.eq .LBB0_19
cmp x1, #2
b.eq .LBB0_23
cmp x1, #3
b.ne .LBB0_27
b iswblank
.LBB0_6:
cmp x1, #9
b.gt .LBB0_15
cmp x1, #7
b.eq .LBB0_20
cmp x1, #8
b.eq .LBB0_24
cmp x1, #9
b.ne .LBB0_27
b iswpunct
.LBB0_11:
cmp x1, #4
b.eq .LBB0_21
cmp x1, #5
b.eq .LBB0_25
cmp x1, #6
b.ne .LBB0_27
b iswgraph
.LBB0_15:
cmp x1, #10
b.eq .LBB0_22
cmp x1, #11
b.eq .LBB0_26
cmp x1, #12
b.ne .LBB0_27
b iswxdigit
.LBB0_19:
b iswalnum
.LBB0_20:
b iswlower
.LBB0_21:
b iswcntrl
.LBB0_22:
b iswspace
.LBB0_23:
b iswalpha
.LBB0_24:
b iswprint
.LBB0_25:
b iswdigit
.LBB0_26:
b iswupper
.LBB0_27:
mov w0, wzr
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUV19zqjgU_zTxJVMHElB54AG13uusdZ1uu-0-OSFEoBcCm4Ta9tPfwfgnKErvTEem5_x-yfmbkxAp05gz5gN3DNxpj1QqKYRPyrJ6Y6wXFtGnP1cwJ7-YhJJxyeCmEJBAWlRlxmCxgZRIJmFYKaiSVMKCM5gQCQmMii_Gd2ooFVEsZ1xJSHgE53Bb8IgJuE0-Ic0IjyGRssqZhCohCr5VeQkVCTMGUwlDphQTAM-ANQVWsP8dWPqPluVegnDKaVZFDOAJlUqkPAb4vkW5peqzZP3kpN39Ml7lEAzH-j8IXybrp_9W9-v58t9gMZ9CgKfQAmhyrg8Wy-eHVvnqZ3CSH8TjRbD8qwU-WT49Llrk0_mP-dPlMj8eg9XPFvji75f7xxb56nG-bFlm9bycPLXA_1kFk_sW-fNqZS5_EL-eWXlUPASv-xgPpwCPzXinXMFU6mQANNqmXK0V3FKAJlBL1wrShIg1zYiUAHlmduQ2VTSBAI2uQqAuvmaecAAFU5Xg9d4k41Ve700B8o7mtTDrTJ4xy4RcMhs0nekGLcwI_9W9oa6FBpNyJbJups5Dgxmlcaq6mbqgGsxYkDLpZuqSazCzYstEN1MXZYNZipR_w1pdt01mxek3mLqyG0xZEsq6mbr2G8yqLL_j52tLWj6u5yViG1JlysBbJ33dSMeOap6FZnclSpUS4ACgGUCzuIjCIlP9QsQAzb4Amr19fWD84j18tJ6qROb7Jj00KA6gXgoCxzpKjybvXM7L3ffDrlsYIDzY68N-rGpFfzEeW-tBBws39U2ybR867Zxmn9PY_wbN69gUHU01aQj_qa2cHajDM9X-ezwEdtpDRHDQsZF3MyhuB_vcltrJvZlWB3V0K6zIuWRfN5kzg3kRnmMHG4Gx7e7IONd9szuo7k3fWoJ6Udnf902fpaZvbrdvtnXdOdTFvdkQaHC1j9Af-7Y_ykznvAvnjAbQY9eAI6sFfhwjJvCyIIx19Yw04egEN3D6vDdx-La59aw34U7rsnp0mbjLFIeniWwCL08AY109ZEz48AKeF-9wa-2uTl-iqRJMnZ3uvcjHkYc90mO-PUSW63oDz-sl_mDg4g0LLY-EwyFjI89FLsYDL_QwiawN7qU-spBjDS0P2bbjen1CRsjxHGdDLUqHdAgci-UkzfpZ9p7X46aXSlkx3xshhHsZCVkmd48NhHYXf4BQ_e4Qfo2_C6tYAsfKUqnkaQWVqoz5-p0QM84EUSmPIS3ykgh2FwrCabJ_l2RExOxwOTw-O3qVyPyziZiqpAr7tMgBmtVb7T93pSjeWH2RmO0slwDNtPHvPvodAAD__1Fng34">