Я не знаю ничего, что дает «100%» покрытие, но для векторизации кода (который часто мешает алиасинг) используйте опцию -ftree-vectorizer-verbose=n
, где n - целое число от 1 до 6. Это выводит некоторую информацию почему цикл не может быть векторизован.
Например, с g ++ 4.1, код
//#define RSTR __restrict__
#define RSTR
void addvec(float* RSTR a, float* b, int n)
{
for (int i = 0; i < n; i++)
a[i] = a[i] + b[i];
}
Результаты в
$ g++ -ftree-vectorizer-verbose=1 -ftree-vectorize -O3 -c aliastest.cpp
aliastest.cpp:6: note: vectorized 0 loops in function.
Теперь переключитесь на другое определение RSTR, и вы получите
$ g++ -ftree-vectorizer-verbose=1 -ftree-vectorize -O3 -c aliastest.cpp
aliastest.cpp:6: note: LOOP VECTORIZED.
aliastest.cpp:6: note: vectorized 1 loops in function.
Интересно, что если кто-то переключается на g ++ 4.4, он может векторизовать первый неограничивающий случай путем управления версиями и проверки во время выполнения:
$ g++44 -ftree-vectorizer-verbose=1 -O3 -c aliastest.cpp
aliastest.cpp:6: note: created 1 versioning for alias checks.
aliastest.cpp:6: note: LOOP VECTORIZED.
aliastest.cpp:4: note: vectorized 1 loops in function.
И это сделано для обоих определений RSTR.