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