https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65233
--- Comment #17 from Aldy Hernandez <aldyh at gcc dot gnu.org> --- FWIW, the removal happens by virtue of: /* The hash table traversals above created the duplicate blocks (and the statements within the duplicate blocks). This loop creates PHI nodes for the duplicated blocks and redirects the incoming edges into BB to reach the duplicates of BB. */ redirection_data->traverse <ssa_local_info_t *, ssa_redirect_edges> (&local_info); and right after the PHI is getting cleared, the BB has: <bb 48>: pred: # .MEM_34 = PHI <> # SR.33_45 = PHI <> # SR.32_86 = PHI <> # DEBUG this => D#8 goto <bb 47>; succ: 47 [69.8%] (FALLTHRU,EXECUTABLE) Notice the empty `pred', which would indicate to me a block that is unreachable. Looking at the tree dump for the rest of the function (Track::prep_record_enabled(bool, void*)), I see no branches or fall-thrus to BB 48, so yes... it has become unreachable and should be cleaned up, but the ICEing code is the one that can't handle empty PHI.