我有一个带循环的简单函数。 GCC能够在此函数中对循环进行矢量化。我的GCC版本是4.7.4。
void __attribute__ ((noinline)) foo(int *__restrict__ ptr1, int *__restrict__ ptr2, int *__restrict__ ptr3, unsigned int cnt)
{
unsigned int i;
ptr1 = __builtin_assume_aligned (ptr1, 32);
ptr2 = __builtin_assume_aligned (ptr2, 32);
ptr3 = __builtin_assume_aligned (ptr3, 32);
for(i = 0; i < cnt; i++)
{
ptr3[i] = ptr1[i] * ptr2[i];
}
}
但是,当我将函数参数cnt的类型从unsigned int更改为int时,GCC无法优化循环。
void __attribute__ ((noinline)) foo(int *__restrict__ ptr1, int *__restrict__ ptr2, int *__restrict__ ptr3, int cnt)
{
unsigned int i;
ptr1 = __builtin_assume_aligned (ptr1, 32);
ptr2 = __builtin_assume_aligned (ptr2, 32);
ptr3 = __builtin_assume_aligned (ptr3, 32);
for(i = 0; i < cnt; i++)
{
ptr3[i] = ptr1[i] * ptr2[i];
}
}
在这个新版本的foo中,循环没有矢量化。循环的GCC输出是:
142:未矢量化:数据参考分析失败D.62366_17 = * D.62365_16;
似乎GCC需要参数和它在循环迭代中使用的变量具有相同的确切类型。为什么矢量化在这种情况下依赖于循环迭代变量类型?