https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109462
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I have tried struct Token { unsigned char pad[4]; unsigned int uintdata; unsigned long ptrdata; unsigned short kind; unsigned char pad2[6]; Token () : uintdata (0), ptrdata (0), kind (0) {} unsigned short getKind () { return kind; } unsigned int getLength () { return uintdata; } unsigned long getLiteralData () { return ptrdata; } }; bool bar (Token &); bool baz (unsigned long, unsigned int); void qux (); static inline bool isStringLiteral (unsigned short K) { return ((unsigned short) (K + 65523U) <= 1 || K == 16 || (unsigned short) (K + 65519U) <= 1); } void foo () { Token I; Token Result; int p_count = 0; while (!bar (I)) { if (I.getKind () == 21) ++p_count; if (I.getKind () == 22) { if (p_count == 1) break; --p_count; } Result = I; } if (Result.getKind () == 5 || Result.getKind () == 6) { if (baz (Result.getLiteralData (), Result.getLength ())) { qux (); return; } } if (!isStringLiteral (Result.getKind ())) return; baz (Result.getLiteralData (), Result.getLength ()); __builtin_abort (); } but while that results in very similar IL, it doesn't reproduce that.