https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68721
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Oops, sorry, started already with r231108. During fnsplit, we have split_bbs { 6 }, return_bb is 7, 6 is the only predecessor of 7, and has successor edges to itself and to 7. The effect of the r231108 change is: Removing basic block 8 +Removing basic block 7 Removing basic block 9 -Merging blocks 6 and 7 ... <bb 6>: fn1.part.0 (); - return &a; + return; which is wrong; after fnsplit, the fn1 function doesn't return (has just some abort) unless it calls fn1.part.0 (), but if that function returns (it does in the testcase), then it should return the correct value. fn1.part.0 is conditional endless loop, otherwise return.