https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70232
--- Comment #15 from Jeffrey A. Law <law at redhat dot com> --- So this is definitely related to the FSM threader not being able to share a single jump threading path. Here's an example: j.c.110t.dom2: Registering FSM jump thread: (23, 25) incoming edge; (25, 28) (28, 27) (27, 11) (11, 13) (13, 14) (14, 24) nocopy; (14, 24) j.c.110t.dom2: Registering FSM jump thread: (22, 25) incoming edge; (25, 28) (28, 27) (27, 11) (11, 13) (13, 14) (14, 24) nocopy; (14, 24) Note that the only difference is the incoming edge. The old threader would duplicate the path once and redirect both incoming edges to that single duplicate path. The FSM threader doesn't have that ability and won't until gcc-7. In bb27 and bb11 we have a fairly significant sequence of shifts and ior operations that result in the large number of duplicated statements. I'm a bit surprised that the statements-to-copy clamp didn't kick in here and that's what I'll be looking at for gcc-6. For gcc-7 sharing jump thread paths is high on the TODO list.