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.

Reply via email to