https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109943
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> --- With the __builtin_unreachable present (thus g >= 0) we simplify (int)(char)d to d & 255 which causes the VN difference: Value numbering stmt = _9 = (int) _8; +d.4_7 is available for d.4_7 +_2 is available for _2 Setting value number of _9 to _9 (changed) -Making available beyond BB2 _9 for value _9 -Value numbering stmt = _10 = (int) d.4_7; -Setting value number of _10 to _9 (changed) +Making available beyond BB4 _9 for value _9 +Value numbering stmt = _10 = b.3_6 & 255; +_2 is available for _2 +Setting value number of _10 to _10 (changed) +Making available beyond BB4 _10 for value _10 Value numbering stmt = _11 = _9 % _10; in particular we have _2 = b; b.3_6 = b; d.4_7 = (char) b.3_6; _8 = (char) _2; _9 = (int) _8; _10 = (int) d.4_7; _11 = _9 % _10; vs. _2 = b; b.3_6 = b; d.4_7 = (char) b.3_6; _8 = (char) _2; if (d.4_7 <= 0) goto <bb 3>; [0.00%] else goto <bb 4>; [100.00%] <bb 3> [count: 0]: __builtin_unreachable (); <bb 4> [local count: 1073741824]: _9 = (int) _8; _10 = b.3_6 & 255; _11 = _9 % _10; where the trivial equivalence is no longer visible.