https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78200
--- Comment #14 from Venkataramanan <venkataramanan.kumar at amd dot com> --- Between GCC 6.2.0 and GCC 7 (Nov/10/2016) I see three major differences in gimple opts dump. 1. IPA inline is more aggressive in GCC 7. Looks like it is in-lining more in hot function "primal_bea_mpp". However completely disabling ipa inline still produces regression in GCC 7. 2. Non canonicial gimple formation at tree if conversion. This is already pointed in comment 1. Using -fno-tree-loop-if-convert in GCC 7 brings back the runtime same as GCC 6. 3. In GCC 7 the true block is kept after the "red_cost > 0" check. red_cost = arc->cost - arc->tail->potential + arc->head->potential; if( bea_is_dual_infeasible( arc, red_cost ) ) { True block ==> next++; perm[next]->a = arc; perm[next]->cost = red_cost; perm[next]->abs_cost = ABS(red_cost); Note bea_is_dual_infeasible is expanded by this check red_cost < 0 && arc->ident == AT_LOWER) || (red_cost > 0 && arc->ident == AT_UPPER) Tree VRP in GCC6 moves the true block to the last of the gimple blocks. Now When I compile GCC 6 with -fno-tree-vrp the true block is at same position as in GCC 7 (trunk). I get the regression in GCC 6. So block movement in GCC 6 and not done in GCC 7 is also interesting observation.