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

    <tr>
        <th>Summary</th>
        <td>
            missing switch optimization on by-value vs by-reference parameters
        </td>
    </tr>

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

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

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

<pre>
    godbolt https://godbolt.org/z/PcerxzEYh

the code
```cpp
#include <cerrno>

bool is_good(int ec) {
    if (ec != EINVAL && ec != ENOTSUP &&
        ec != EOPNOTSUPP && ec != ETXTBSY &&
 ec != EXDEV && ec != ENOENT && ec != ENOSYS) {
        return false;
 }
    return true;
}
```

ends up very different when `ec` is a reference instead of a value parameter.
The value case fails to optimize this into a switch statement.

reference:
```llvm
define dso_local noundef zeroext i1 @is_good(int const&)(ptr nocapture noundef nonnull readonly align 4 dereferenceable(4) %ec) local_unnamed_addr {
entry:
  %0 = load i32, ptr %ec, align 4
  switch i32 %0, label %return [
    i32 22, label %if.end
    i32 95, label %if.end
    i32 26, label %if.end
    i32 18, label %if.end
    i32 2, label %if.end
    i32 38, label %if.end
 ]

if.end:
  br label %return

return:
  %retval.0 = phi i1 [ true, %if.end ], [ false, %entry ]
  ret i1 %retval.0
}
```

value:
```llvm
define dso_local noundef zeroext i1 @is_good(int)(i32 noundef %ec) local_unnamed_addr {
entry:
  %cmp = icmp eq i32 %ec, 22
  %cmp1 = icmp eq i32 %ec, 95
  %or.cond.not25 = or i1 %cmp, %cmp1
  %0 = and i32 %ec, -9
  %1 = icmp eq i32 %0, 18
  %or.cond14.not24 = or i1 %or.cond.not25, %1
  %cmp9 = icmp eq i32 %ec, 2
  %or.cond15.not23 = or i1 %cmp9, %or.cond14.not24
  %cmp11 = icmp eq i32 %ec, 38
 %or.cond16.not = or i1 %cmp11, %or.cond15.not23
  ret i1 %or.cond16.not
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVltv4ygU_jXk5aiRwbFrP_ghvUTa1apTqd3R9KkicJKwS8ALOJ3216_ApE3Sy2qlsSrV8J3rdz6CufdqbRA7Ul2Q6mrCh7CxrvudG6P-ZkXbTpZWPndrK5dWB9iE0HtSzglbELbIu1Pr1oQtXghb3Ap0P1-uHzakmJNiHjYIwkqMq7oY_0TfxyUrlRF6kAikvBTonLGkvB7dltZqUP5xba0krFEmAArCWiDnF6SYAwCoFRDWoADCKCmv4Pq3m-_zP4CwmrAaDvZvvt3f_XmbgewcnwOTb7ej0e0H7vc_7i_uHg7cD7AfV9ffP8x4fXP_4f7dw91xF_FxGAZnYMW1R1ImhJxfZYMMBjdkbIReyRz5QiM9DD3s0D2DVKsVOjQBnjZogNQFClIXoDxwcJgwgaCMD8gl2BVw2HE9IPTc8S0GdFNSzO83mLcF9wgrrrSHYMH2QW3VC0LYKA_KBAsc_JMKYgM-8IBbNGE61vWaLSrmoGqtd1tSzCWulEGQ3j5qK7gGYwcjcQUv6Cz-DKAokFlxLARhjQ-J3Jawpg8OjBW8D4PDV39jjRm0BodcWqOfgWu1NjADia8l8aVGwppZGgirRn2lMh4HY_gW5SOX0uVhoQnueewConkBcaTacgmqZIRdQqwkx7nc50vWmRtVsuQYYc2XqOMqjzeevSzrkgFjRzZqNUUjD_C2-hqP3HyF0-Y__L-Gy8_cSXU1jj1vZbaW7rTfvTjS-xunDsOO6-lIbb9RafzVxSh-dvmWLGWKG9VFPjYjmoaUy0hHJ0V4C_zZ8Uky_3USHZUZqdob_399iW2faFDxBf_Zq2dUF2MHZvRzu7ba21k3FdbIqbGBVcnBukyO2PaZvhjsWN_cyOOIZ-3e4MO0Sdy0OclKZynv7DjvUUm5AnrQV_tF_6cJqhSlfNdYm-OeFHLI3hf0lamRA_c6ur9LQulJllzNiQiPgrxX4kR2pWzLlk-wo-dlVTZ1e04nm47StmpmKOpKMEp5MasbsaSzpmjqpl1xNlEdK9iMMtZQWtWUTov6vOEF5zXSqqhZQ2YFbrnS06jpeFdPlPcDdpRRVrNJOpw-3f-MGXyChBLG4ueA66LT2XJYezIrtPLBv4UJKmjstsp7Zdb737l8P_CgrAFrYPl8Nl4jOx_f3y6g19vGTwanu5MvCxU2w3Iq7JawRTqL47-z3tm_UATCFqlMT9gi97Hr2L8BAAD__z1RiLY">