https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66372
--- Comment #4 from James Greenhalgh <jgreenhalgh at gcc dot gnu.org> --- I think this is the same issue as I spotted in the larger testcase. Looking at the cancelled jumps: trunk/foo.c.096t.dom1: Cancelling jump thread: (6, 8) incoming edge; (8, 13) joiner; (13, 9) normal; trunk/foo.c.096t.dom1: Cancelling jump thread: (7, 9) incoming edge; (9, 13) joiner; (13, 10) normal; With r223448 reverted: reverted/small.c.096t.dom1: Cancelling jump thread: (6, 8) incoming edge; (8, 13) joiner; (13, 9) normal; reverted/small.c.096t.dom1: Cancelling jump thread: (7, 9) incoming edge; (9, 13) joiner; (13, 10) normal; reverted/small.c.096t.dom1: Cancelling jump thread: (2, 3) incoming edge; (3, 4) joiner; (4, 5) normal; If we fail to cancel 2 --> 3 to 5, we will probably end up in trouble given the other blocks we've threaded through: trunk/small.c.096t.dom1: Threaded jump 6 --> 10 to 16 trunk/small.c.096t.dom1: Threaded jump 7 --> 10 to 16 trunk/small.c.096t.dom1: Threaded jump 15 --> 13 to 17 trunk/small.c.096t.dom1: Threaded jump 8 --> 13 to 17 trunk/small.c.096t.dom1: Threaded jump 3 --> 4 to 15 trunk/small.c.096t.dom1: Threaded jump 14 --> 13 to 16 trunk/small.c.096t.dom1: Threaded jump 9 --> 13 to 16 And taking a look at the path we're processing just before the ICE, it does start (2, 3).