<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/130681>130681</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
`switch` idiom recognition that fires on integers doesn't fire on pointers
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:optimizations,
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Kmeakin
</td>
</tr>
</table>
<pre>
`src1` gets optimized into `tgt1`, but `src2` doesn't get optimized into `tgt2`:
```c
uint64_t src1(uint64_t i) {
switch (i) {
case 0:
return 0;
case 1:
return 1;
case 2:
return 2;
default:
__builtin_unreachable();
}
}
uint64_t tgt1(uint64_t i) {
if (i > 2) {
__builtin_unreachable();
}
return i;
}
char* src2(uint32_t i, char* p) {
switch (i) {
case 0:
return &p[0];
case 1:
return &p[1];
case 2:
return &p[2];
default:
__builtin_unreachable();
}
}
char* tgt2(uint32_t i, char* p) {
if (i > 2) {
__builtin_unreachable();
}
return &p[i];
}
```
# Motivation
Trying to optimize enum-to-string code by reducing number of globals that have to be loaded:
```rust
pub enum Foo {
A,
B,
C,
}
pub fn src(foo: Foo) -> &'static str {
match foo {
Foo::A => "A",
Foo::B => "B",
Foo::C => "C",
}
}
pub fn tgt(foo: Foo) -> &'static str {
const ABC: &str = "ABC";
match foo {
Foo::A => &ABC[0..1],
Foo::B => &ABC[1..2],
Foo::C => &ABC[2..3],
}
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0VU-PuzYQ_TTDxQoyQ_h34ABJc6l6631lwIBbwJE9bLX99JUNmz-_3a26rYpQAnlvPPOeZ2JhrRoWKUtIakjOgVhp1Kb8eZbid7UEje7eSki5NW0EKWeDJMv0ldSs_pQdUwtpBimngRwMeGLNSmwLQBfQaWkXwIxc6OeRjgdxBdzfKd_uFni1qoXS4wsxnx7z27sCLBhkNfCKMcbsH4rakQHmPwDuaoWVbE_AHi4jaTWLQz6woy_Z0c72NPyShs-LdrIX60Q7_eWlWdVEanlZFyNFO4pmkoA5YHEPg-zs3Ng-H5zwTn_thOq9Cwzinxh-9OIbqR_UqA27FdOOwgBWzO_xVkuMWy0n9g5e_-0W7UkB0yskNYfk_K0d2uOiz-Pw0yT4gfzfd-zdB9_g_8Sk_2XrdoHqJvBW323Q9leM2S-a1KsgpRfg1a_mTS0DI30bWiaXdT6QPlgyDmp1J1nzxozs1tb9sKxzIw3TPRsm3YjJMhoFsVG8SrdOI9mkRSe7fdjfCzCrJeDVdW18BnbR-l17BXjaBdX3x9P2eJPiIvvFtSNg3msNceUWcR4enJuAKWBmSZBqmSXz4OwsXFf294z7dfGrQFxVDOLztghWgHiv4olWP9Dqr2mnB9rpifZD9-ySaKBvS2r1YolV9cnFAKYejc9eQO2Tbo3wfQNSF5_UPAz9dG21f2bBTozCEO_Ev_Fi52MYxk_8J1Pe2yXoyrgr4kIEsoyyY5Qe82OWB2PZ5DItZBf3UV_kMkqlzIuU86LosiLnRRKoEjkmPI44xtExzkLeZzzNi6w5Nl2R9BKOXM5CTeE0vc6hNkOgrF1lGcU8zaNgEo2crD8pER0F4mofDj81dt9RxFlZK7vDI-iw5ByY0gUemnWwcOSTsmTv2UjRJP1x6_8t3fmpOqVnZmSrh0W5dbaZ6pWRlunFnaNykMY-HLQOc9BVO9DYYDVTORJdrTMeL4CXQdG4NmGrZ8CLV7J9Ha5G_yZbArx45Rbwsot_LfGvAAAA__958zbj">