https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104601
Bug ID: 104601 Summary: [11 Regression] Invalid branch elimination at -O2 Product: gcc Version: 11.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: markus.boeck02 at gmail dot com Target Milestone: --- Following code has been produced via reduction with `creduce`. When compiled with `-O2`, GCC 11 and later versions will incorrectly print `f`, while if `-O1` or lower, or an older version of GCC is used, it will correctly print 't'. #include <algorithm> #include <cstdio> #include <optional> inline std::optional<int> a(std::vector<int>::iterator b, std::vector<int>::iterator c, std::optional<int> h(int)) { std::optional<int> d; find_if(b, c, [&](auto e) { d = h(e); return d; }); return d; } std::optional<int> f(int) { return 1; } main() { std::vector<int> g(100); auto e = a(g.begin(), g.end(), f); printf("%c", e ? 't' : 'f'); } For the sake of completion, this was the original code: https://godbolt.org/z/enx19v7E5