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.