https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126999
--- Comment #1 from Andrew Macleod <amacleod at redhat dot com> --- When processing builtin_unreachable the final time in VRP2, we maintain a list of blocks which form the Connections on the false side of the unreachable expression,. so we can be sure all uses of an ssa-name are dominated before rewriting their global value.. In this case, I see: Removing dead stmt:g22_lsm_flag.12_3 = PHI <1(3)> Removing dead stmt:c10_9 = PHI <1(13)> Removing dead stmt:g22_lsm_flag.12_22 = PHI <1(19), 1(18)> Removing dead stmt:c10_23 = PHI <1(10), 1(9), 1(3)> Removing dead stmt:fp5_25 = PHI <f3(3)> Removing dead stmt:fp5_27 = PHI <f3(8)> Removing dead stmt:g22_lsm_flag.12_29 = PHI <1(8)> Removing dead stmt:fp5_38 = PHI <f3(19), f3(18)> Removing dead stmt:fp5_39 = PHI <f3(17)> Removing dead stmt:g22_lsm.11_42 = PHI <0(8)> Removing dead stmt:g22_lsm.11_43 = PHI <0(19), 0(18)> Fixing up noreturn call f3 (); So one of the blocks has a no-return fixup, which splits a block during substitute_and_fold, and now the block pairs stashed away no longer has an edge between them .. IM not sure whey the edge itself isn't being stashed away.. that is one option. This is all within VRP before it runs DCE and it wasn't expecting a CFG change...
