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

--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
OK, so I can add heuristic that avoids copying BBs with exit conditions based
on non-IVs/non-invariants but that doesn't fix this testcase since the
fourth condition in the loop is based on the load from 'ja':

    do j=1,n                    ! Outer loop j: columns of A
!CDIR ALTCODE=LOOPCNT
!CDIR NODEP
!DIR$ IVDEP
      do k = ia(j), ia(j+1)-1   ! Inner loop i: rows of (sparse) A
        i = ja(k)               ! (the i's are distinct for different j's)
        y(i) = y(i) + a(k) * x(j)
      end do
    end do

so we copy the header check for the ia(j), ia(j+1)-1 range (together with
its bounds checks) plus the bounds check for ja(k) but _not_ the bounds
check on 'i' which is strictly ordered before the invariant bounds check
for j on x(j).

I could relax the heuristic further but I think changing
gcc.dg/tree-ssa/copy-headers-5.c to

int is_sorted(int *a, int n)
{
  for (int i = 0; i < n - 1; i++)
    if (a[i] > 0)
      return 0;
  return 1;
}

shouldn't rotate the loop beyond hoisting the initial 0 < n - 1 check.

But we are now asking for exactly that to be able to hoist a further down
conditional that is invariant by means of rotating the loop.

That said, I have a patch restoring originally intended behavior (albeit
in a somewhat awkward way).

Reply via email to