https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78200

--- Comment #16 from Venkataramanan <venkataramanan.kumar at amd dot com> ---
GCC7 added early treading pass and gimple thread pass before VRP. When I
disable these passes, tree-vrp is able to move the true block same as that of
GCC6.

It again the tree-if-convert causing the moved block to come back to its
original position. Also non canonical gimple gets formed.

 <bb 27>:
  _496 = _512 == 2;
  _495 = red_cost_503 > 0;
  _494 = _496 & _495;
  if (_494 != 0)
    goto <bb 28>;
  else
    goto <bb 29>;

  <bb 28>:                             <== True block.
  _502 = basket_size_lsm.75_514 + 1;
  _501 = perm[_502];
  _501->a = arc_516;
  _501->cost = red_cost_503;
  _498 = ABS_EXPR <red_cost_503>;
  _501->abs_cost = _498;

If we turn off tree-if-conversion, the basic block reordering at RTL brings
back the block to its position. But we dont see regression since the  check is
in order.

  <bb 20>:
  _344 = _23 == 2;
  _345 = red_cost_86 > 0;
  _342 = _344 & _345;
  if (_342 != 0)
    goto <bb 86>;
  else
    goto <bb 21>; 

This makes me believe that swapping the operands causes the regression.

Reply via email to