You must use the builtins __builtin_assume
#include <cassert>
bool no_alias(int* X, int* Y);
void foo(int *A, int *B, int *N) {
int* p = N;
if (no_alias(A, N)) {
__builtin_assume(p != A);
}
for (int k = 0; k < *p; k++) {
A[k] += B[k];
}
}
And maybe add the compilation option -fstrict-aliasing
(gcc, strict-aliasing, and horror stories)