https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80887
--- Comment #3 from Marc Glisse <glisse at gcc dot gnu.org> --- Seems to me that it is FRE valueization doing something strange. We have (not in a loop) _26 = CHAIN.23_25(D)->parse_pos; _28 = _26 + 1; CHAIN.23_25(D)->parse_pos = _28; _30 = CHAIN.23_25(D)->expression; _32 = _30->P_ARRAY; _33 = CHAIN.23_25(D)->parse_pos; parse_pos.11_2 = (sizetype) _33; _3 = parse_pos.11_2 + 4294967295; and when, during the simplification of some later stmt that turns out to be equivalent to _3, we call vn_nary_op_lookup_pieces on _26 (with a NOP to sizetype), it returns _3, so obviously we loop.