[Bug tree-optimization/65443] Don't peel last iteration from loop in transform_to_exit_first_loop

vries at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Mar 16 17:12:00 GMT 2015


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

--- Comment #2 from vries at gcc dot gnu.org ---
AFAIU, this is meant with the todo:
...
  <bb x>:
  goto <bb y>;

  <bb 4>:
  i_17 = (int) ivtmp_6;
  _7 = (long unsigned int) i_17;
  _8 = _7 * 4;
  _9 = pretmp_24 + _8;
  _10 = *_9;
  sum_11 = _10 + sum_y;
  i_12 = i_17 + 1;
  i.1_3 = (unsigned int) i_12;

  <bb y>:
  # sum_y = PHI <1(x), sum_11(4)>
  # ivtmp_y = PHI <0(x), ivtmp_6(4)>
  if (ivtmp_y < _20 + 1)
    goto <bb 6>;
  else
    goto <bb 5>;

  <bb 5>:
  # sum_21 = PHI <sum_11(4), sum_26(8)>
  goto <bb 7>;

  <bb 6>:
  ivtmp_6 = ivtmp_y + 1;
  goto <bb 4>;
...

So, sort of:
- Split bb 4 before the loop condition, creating bb y.
- Don't enter the loop at bb 4 as before, instead jump to before the loop
  condition, to bb y (creating bb x in the process) 
- For each phi in bb 4, add a corresponding phi to bb y: 
  - For the values for entry from bb x, use the values in the phis in bb 4 for
    entry from bb 11.
  - For the values for entry from bb 4, use the reaching definitions.
- increase loop bound with 1 (_20 + 1)
- simplify the phis in bb 4
- use the new phis in bb y as defs for the reachable uses

The problem with this transformation is that '_20 + 1' might overflow, that's
what the comment 'This may need some additional preconditioning in case NIT =
~0' refers to.



More information about the Gcc-bugs mailing list