我有一个带循环的简单函数。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 需要它在循环迭代中使用的参数和变量具有相同的确切类型。为什么在这种情况下矢量化取决于循环迭代变量类型?