jtb20 wrote: > > FWIW, I don't think there's a reasonable, safe way to collapse loops like > > this and maintain parallel semantics, but ICBW. > > I think, there is a proper way. Just annotate these instructions with > something like: > > ``` > if (first inner loop iteration) { > arr[i][i] = ...; > } > ``` > > and it should be correct
I think you're right for this particular test case, but I don't think that solution works in general. Consider something like: ``` int arr1[N][N], arr2[N]; #pragma omp parallel for collapse(2) { for (int i = 0; i < N; i++) { arr2[i] = i; for (int j = 0; j < N; j++) { arr1[i][j] += arr2[i]; } } } ``` Now, if collapsed loop iterations take place in parallel or in an arbitrary order, there could be a read from arr2[i] before the write (in the "first" inner loop iteration). That is, I think we'd have something like: ``` for (int ij = 0; ij < N*N; ij++) { int i = ij / N, j = ij % N; if (j == 0) { arr2[i] = i; } arr1[i][j] += arr2[i]; } ``` and that's still not safe. https://github.com/llvm/llvm-project/pull/96087 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits