https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118316
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #2) > Interesting clang is able to optimize the above but not the loop. clang produces: ``` unsigned bar1(char* buf, unsigned len) { unsigned t = len - (len != 0) + 1; t = t & ~1; len = len - t; if (len) * buf = 42; return len; } ``` Which and what is missing is the transformation of `len - (len != 0) + 1` to just `max<len, 1>` which I created PR 118317 for that and once that is done GCC is able to handle the rest for that form too (due to the match patterns added by PR 98304).