__promise((n > 0) && ((n & 7) == 0));
Двоичное представление 7
равно 0b111
. Это говорит о том, что последние 3 бита n
всегда будут равны нулю. Следовательно, n
должно быть кратно 8
. Furtermore n
также будет больше, чем 0
.
Таким образом, вы обещаете компилятору, что он может безопасно развернуть ваш цикл в блоки 8
и выполнить хотя бы одну итерацию.
Компилятор может , поэтому решите переписать ваш код как:
int i = 0;
do
{
x[i+0]++;
x[i+1]++;
x[i+2]++;
x[i+3]++;
x[i+4]++;
x[i+5]++;
x[i+6]++;
x[i+7]++;
} while ((i+=8) != n);
Что пропустит кучу сравнений.
NEONs VADD
инструкция даже позволит вам оптимизировать это еще дальше: vaddq_s32
позволит вам добавить вектор (1,1,1,1) в группы из четырех элементов вашего массива одновременно. Таким образом, ваш компилятор может заменить этот блок двумя инструкциями vadd (если вам кажется, что вы могли бы извлечь из этого пользу).