<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/154022>154022</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed optimization with `-fstrict-enums` for by-value parameters.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
keinflue
</td>
</tr>
</table>
<pre>
In the following C++ code compiled with `-O2 -fstrict-enums`, the second function is optimized to return `false` unconditionally, while the first one isn't:
```cpp
enum E { A, B };
bool f(E e) { return e > 1; };
bool g(E& e) { return e > 1; };
```
```asm
_Z1f1E:
cmp edi, 2
setge al
ret
_Z1gR1E:
xor eax, eax
ret
```
`f` should be optimized to return `false` unconditionally just like `g`.
The value range of `E` is [0,1] in C++ and it seems to me that this range information for the load of `e` is present in both cases coming from the Clang codegen, but is ignored and lost during the SROA pass:
```llvm
define dso_local noundef zeroext i1 @_Z1f1E(i32 noundef %0) {
%2 = alloca i32, align 4, !DIAssignID !23
store i32 %0, ptr %2, align 4, !tbaa !25, !DIAssignID !29
%3 = load i32, ptr %2, align 4, !tbaa !25, !range !31, !noundef !32
%4 = icmp sgt i32 %3, 1
ret i1 %4
}
define dso_local noundef zeroext i1 @_Z1gR1E(ptr noundef nonnull align 4 dereferenceable(4) %0) {
%2 = alloca ptr, align 8, !DIAssignID !41
store ptr %0, ptr %2, align 8, !tbaa !43, !DIAssignID !45
%3 = load ptr, ptr %2, align 8, !tbaa !43, !nonnull !32, !align !47
%4 = load i32, ptr %3, align 4, !tbaa !25, !range !31, !noundef !32
%5 = icmp sgt i32 %4, 1
ret i1 %5
}
;...
!31 = !{i32 0, i32 2}
```
=>
```llvm
define dso_local noundef zeroext i1 @_Z1f1E(i32 noundef %0) {
%2 = icmp sgt i32 %0, 1
ret i1 %2
}
define dso_local noundef zeroext i1 @_Z1gR1E(ptr noundef nonnull align 4 dereferenceable(4) %0) {
%2 = load i32, ptr %0, align 4, !tbaa !34, !range !38, !noundef !39
%3 = icmp sgt i32 %2, 1
ret i1 %3
}
```
https://godbolt.org/z/dz8xczYKP
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMVtFu2zYU_Rr65cKGeCnZyoMf7NgGimHo0O1lfSko6UpmS5ECSTVpvn4gJSeZ42ItMAwLDEiR7j08POeIpPRedYZoy4o9Kw4LOYazddsvpEyrR1pUtvm2fWcgnAlaq7V9UKaDe4Z7hnuobUNQ235Qmhp4UOEMbJ0t3yMsWx-cqsOSzNh7ts4Y3icQT7U1DbSjqYOyBpQHOwTVqydqIFhwFEZnIkwrtSe2zmA0sUXFcqn1t4j0cFaaJlLK-QDWEChvGG4CEzuWpd86m371MLBsF4nAEdhmD7sIsQe2OTCxZ9muslZDy7A8AjG8SzUzDwImjsCZuC7vYjnD9Q91PFO5YiZ9z7Ldp4-85ceJN8x_dT-kKzUqksVXrzyFjgBA6vjQUZhAP33k3YdrmEfrJhj5GGHi5eXl3PqGWxtF92c76gYq-ll74PPoA2j1hWJVx9bZakL-40zwVeqRwEnTEdg2FhwjhPLAin3MCGfFAZR5Tpg0DagAnqj3cfw-ui4DhLPyM44yrXW9TGlqrUup0FY28wA0DzA48mRCBK9sOEMtPfkY3hjo1tk-Nd5rabqU645MlKwaQ-xWnbGOmsRHWx-gGV1sjD2_f3i_g0F6_zZ6Wn-NDjfUKkPQePtJ21pqMHY0DbXwRM7SYwDFgeXZHAQslcDnEoZFNkcsecewQGDiAFJHLFACI0-pVWcgj7cM-eHdLn3Y7w7xPxSp0wfrKNbPmPcwBJfw3gKESsrUWtxGvLtwEYlL0ntm8hOgk4EMueDzk5dZc5FCz7DI0xAqfhK-C5cJiNjBEw1Hk4JY5FH8zWFy4cdVTx8OlpH5pcZYY0atLzOAhhy15MjUJCtNDMs8ufIP7gzBvehQ3tQy56_cmcX7jjvllZC5uI1Y3HBnZvIToBcJJi-mZ1NLrNpcxsi_lwDx7yQgQhU3I5DfikDxOgJM7FertP7EERIIQ842-4iQRI43ONe_XgnFgYnjf_UpX08suzUx_N9k-4bX2fe9Fvkbr8sbXl-tKNeS4C1JxIskf9_FziEMaTnGE8NTZ5vK6rCyrmN4emJ4ap7Kx_rpz19-WzRb0dyJO7mgLd8URZ6vOeeLc3y6bqngOZVUCmpQlFWV5YS8bDebSi7UFjMsspJveFEUnK9wXYtmLWl9h0UjBbI8o14qvYrJiWMvlPcjbXmRZ4gLLSvSPp27EA09QHrLEOMxzG1j07IaO8_yTCsf_AtMUEHT9lflPTWX3Xna_p5PYNenr7QxVt-W0_47SCd7CuT8ajE6vb1SS4XzWK1q2zM8pdRPl-Xg7GeqA8NTouoZnua5fN3iXwEAAP__0NXuNg">