https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121712
Bug ID: 121712 Summary: not removing loop when iterates once only Product: gcc Version: 16.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: enhancement Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: pinskia at gcc dot gnu.org Target Milestone: --- Take: ``` void f0(int *a, int *b, int *c) { auto t = b - a; if (t == 1) { do { a++; *c += 1; c++; } while (a != b); } } #include <vector> void f1(std::vector<int> &a, int *c) { if (a.size() != 1) return; for(auto b : a) { *c += 1; c++; } } ``` f is a reduced version of f1 (so it does not have the issue referenced in PR 121710). Basically these two should reduce down to just: ``` void f0_tgt(int *a, int *b, int *c) { auto t = b - a; if (t == 1) (*c) ++; } void f1(std::vector<int> &a, int *c) { if (a.size() != 1) return; (*c)++; } ```