2

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

4

0 回答 0