Split out from PR80198 void __attribute__((noipa)) generic(int * a, int * b, int c) { int i; a = __builtin_assume_aligned (a, 16); b = __builtin_assume_aligned (b, 16); for (i=0; i < 256; i++) { a[i] = b[i] | c; } } is versioned for aliasing by the vectorizer, not realizing the alignment guarantees allow vectorizing with 16byte vectors without. Actually the CCP pass after the vectorizer is able to elide the check, so this but is merely to track the cost side of this (also when mixed with a more complex required versioning check it might fail to optimize later).
A related(?) case from the same PR is the following where one could argue we should have propagated the equivalence. void __attribute__((noinline)) generic(int * a, int * b, int c) { if (a == b) { for (int i=0; i < 256; i++) { a[i] = b[i] | c; } } }