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