<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/98753>98753</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Miscompilation with libstdc++'s std::optional<int> and -O1
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
cadubentzen
</td>
</tr>
</table>
<pre>
https://godbolt.org/z/KjEreWf57
With Clang 18.1 and libstdc++, we get different behavior when compared to Clang 17 in the code below:
```cpp
#include <optional>
#include <iostream>
// defined in a separate compilation unit
int takeIntRefAndReturn0(int&);
std::optional<int> shouldReturnEmptyOptional() {
int v = 5;
if (takeIntRefAndReturn0(v))
return v;
return std::nullopt;
}
int main() {
auto opt = shouldReturnEmptyOptional();
if (opt && *opt > 0) {
std::cout << "SHOULD NOT BE PRINTED: *opt = " << *opt << std::endl;
return 1;
}
std::cout << "SHOULD BE PRINTED" << std::endl;
}
```
With Clang 17, we get `SHOULD BE PRINTED`, while with with Clang 18.1 we get `SHOULD NOT BE PRINTED: *opt = 5`.
With git-bisect, I found that this is caused by https://github.com/llvm/llvm-project/commit/060de415af335fdd82910f409e2be3b8457eaa43.
An isomorphic example to reproduce this (https://godbolt.org/z/9PsjY17sT):
```cpp
int takeIntRefReturn0(int &);
void assertNotReached(int);
static bool logicalAnd(bool a, bool b) { return a && b; }
int main() {
int v4;
bool v3;
{
int v1 = 5;
int v2 = takeIntRefReturn0(v1);
v3 = v2 != 0;
if (v3)
v4 = v1;
}
// Move to a function so that && is not short cutted.
// v4 will be undefined if v2 == 0, but v3 is false, so the branch shouldn't be entered.
if (logicalAnd(v3, v4 > 0))
assertNotReached(v4);
return 0;
}
```
Note in the generated LLVM IR that
```llvm
%6 = icmp sgt i32 %5, 0
%7 = and i1 %3, %6
br i1 %7, label %8, label %9
```
was reduced to only
```llvm
%6 = icmp sgt i32 %5, 0
br i1 %6, label %7, label %8
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVt1u2zoSfhr6ZlBDIvXnC184toMNtk2KbHeLvaTEscUemhRESj7p0x-Qkm3ZTpsDHMBIRHJ-vhnOfBxurdxrxCVJH0i6mfHO1aZdVlx0JWr3E_WsNOJtWTvXWMJWhD4S-rg3ojTKzU27J_TxJ6GP__6xbfH7Ls1JtCHRavj7Xboa1orrPcTFPAauBShZWicqQh_Cbw1HhD06EHK3wxa1gxJr3kvTwrFGDZU5NLxFAc6cTOUgNbgaoTICoURljh7ZxDHJouFXNc24Q5nUleoEAmFr0zhpNFeEbd87lsa6FvnhcjwK-dhB4E5qFB4EB4sNb7nDgFMq7u1Cp6UbVKR24Pgf-KTdK-5WWryi61odEVpI7QjNCF0Q9jD1Yp3w0bDVBeTay7It2Np0ajSxPTTu7eUkQgtCF0Dy0RKAd9wDYRtIz_YB5A4ILX4BqPdY6OIkC9CGI-gnBsatM0bdKWUadwkh30xj8SgOXOp7fLxzBkzjAsQP4roLIOj53GVA6GqwsoXoxgVcYFam8zJrwtZAKP3Pv17--3kDzy_f4GELX1-fnr9tN4StLtY2XuyiMe6G1dkoaqEm0M7JiS-b53R8iGWC4-L4fVeXHJ-q_Fc9l0_6i2TRvassChK1VAhHr3i86dhReaL926SlJIvmd2j20n0qpcXKeW9PsDOdFuBq7sDV0oK0UPHOooDyDW6IRrq6K-eVORD6qFR_-vepac2PYPCxMoeD9B9RFglM4pTvGEt3QhR0EUe7JFogLZGVRZLmyHnCrgCuNEhrDqZtalkB_skPjULPNS02rRFdhQNGQouPKHDx1f74f5zbb6Fkf8lE15RwxQdwQwi9kQK4tdi6Z-NekVc1ihN13PMGd7KC0hgFyuxlxdVKe-mww33qw1c5tsmpXPmplUrCHuBvN3AgmGRS_8F4z6bFP-mNIB7fEdJ4QMPBe1np42sCAOhZEPY6NPZf0bW9wBA9u2IygD4ZtCbNOe3Okdq_mB7B3z6HXaerQObWDKU6Zkla0MZ5ymodVJ1zKOY3VvoEjlIpKBE6fX4tdmOYA2R_G53zwUgLO64s-q3gC6Fsua7qkRY1obl_FAG1w3bibYj06qp92Osh1oEPr7LwTiX1yX0hnYks-pByno3D02O8R43-JRTw-fP_vsDTa0jbjVpo4fExTbNwJbI6NGD3DiTzV5qmPoToLJQHIT85yNgfhwi98iBRtuN-4DrFS1R-VVytFjcoYFgfuYUWfY-H6cJo9fbP4J7BZFfub6Fd-5iJJRMLtuAzXMY5jYoFjbNoVi8XKWdpHMdZVpUlS6KEVWlWJfkiqnIuMJ_JJY1oEuUxi3OWRdE8y6o452WBGS-KLCtIEuGBSzX3cXimmklrO1wuijxls4DIhsGPUo1HCIeEUj8HtstAs2W3tySJlLTOXqw46RQuv0g7HXrC03Ez3eUWfjPO-Ev99BLPulbdzpcf034Aaz3thmD6Jf0rAAD__yPjDwk">