https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80181
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- Ok, so we have dl_7 = vp_2 ^ _1; dl_8 = dl_7 ^ vp_2; where in the first iteration dl_7 is optimistically _1 (vp_2 is 0) and thus this gets simplified to dl_7 (CONSTANT). While in the 2nd iteration it is VARYING, then this gets simplified to _1 (CONSTANT) which has already been fully propagated and thus gets its lattice value used (UNDEFINED). So we get a bogus lattice transition CONSTANT -> UNDEFINED. There's a missed optimization that we do not treat XOR as UNDEFINED if one operand is undefined. That fixes the testcase.