This loop: void __attribute__ ((noipa)) f (int a[][N], int b[restrict]) { for (int i = N - 1; i-- > 0; ) for (int j = 0; j < N - 1; ++j) a[j + 1][i] = a[j][i + 1] + b[i]; } should be vectorisable using outer loop vectorisation, since the dependence between the lhs and rhs is in the same nonzero direction for both loops. See https://gcc.gnu.org/ml/gcc-patches/2019-03/msg01224.html for some discussion about how the dependence checks could be handled.
Confirmed.