[clang] [clang] add array bounds constraints using undef for out-of-bounds access (PR #159046)
Sjoerd Meijer via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 18 05:19:01 PDT 2025
sjoerdmeijer wrote:
Yeah, we need numbers.
I took the motivating example from the description, slightly modified it, and added a vectorisable loop:
int test_simple_array(int i, int n, int * __restrict A, int * __restrict B) {
int arr[10];
for (int i = 0; i< n; ++i)
arr[i] += A[i] * B[i];
return arr[i];
}
This gets vectorised, see: https://godbolt.org/z/GWb5h7hMb
With this patch locally applied, it is no longer vectorised, and I am getting the following with -Rpass-analysis=loop-vectorize:
t.c:13:11: remark: loop not vectorized: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop
distribution to attempt to isolate the offending operations into a separate loop
Unsafe indirect dependence. Memory location is the same as accessed at t.c:13:4 [-Rpass-analysis=loop-vectorize]
When I slightly modify the input example, and not let it accumulate, i.e. just have this:
arr[i] = A[i] * B[i];
I am getting:
t.c:13:11: remark: Recipe with invalid costs prevented vectorization at VF=(vscale x 1): store [-Rpass-analysis=loop-
t.c:12:3: remark: the cost-model indicates that vectorization is not beneficial [-Rpass-analysis=loop-vectorize]
And this version gets also vectorised with unpatched clang.
I hope I didn't make a silly mistake with this quick little exercise, but it looks like this gets into the way of vectorisation and that this doesn't bode very well for perf numbers....
https://github.com/llvm/llvm-project/pull/159046
More information about the cfe-commits
mailing list