Clang,AVX水平添加的链接时间优化失败

时间:2014-09-05 13:22:05

标签: optimization linker clang avx

我有一小段测试代码,它使用AVX指令计算两个矢量的点积和第三个矢量(下面的点C和B点C)。它还添加了两个产品,但这只是为了让函数为这个例子返回一些东西。

#include <iostream>
#include <immintrin.h>

double compute(const double *x)
{
  __m256d A = _mm256_loadu_pd(x);
  __m256d B = _mm256_loadu_pd(x + 4);
  __m256d C = _mm256_loadu_pd(x + 8);

  __m256d c1 = _mm256_mul_pd(A, C);
  __m256d c2 = _mm256_mul_pd(B, C);

  __m256d tmp = _mm256_hadd_pd(c1, c2);

  __m128d lo = _mm256_extractf128_pd(tmp, 0);
  __m128d hi = _mm256_extractf128_pd(tmp, 1);

  __m128d dotp = _mm_add_pd(lo, hi);

  double y[2];
  _mm_store_pd(y, dotp);

  return y[0] + y[1];
}

int main(int argc, char *argv[])
{
  const double v[12] = {0.3, 2.9, 1.3, 4.0, -1.0, -2.1, -3.0, -4.0, 0.0, 2.0, 1.3, 1.2};

  double x = 0;
  std::cout << "AVX" << std::endl;
  x = compute(v);

  std::cout << "x = " << x << std::endl;

  return 0;
}

当我编译为

clang++ -O3 -mavx main.cc -o main
一切正常。如果我启用链接时间优化:

clang++ -flto -O3 -mavx main.cc -o main

我收到以下错误&#34; LLVM ERROR:不知道如何拆分此运算符的结果!&#34;。我已将罪魁祸首缩小到_mm256_hadd_pd陈述。如果用例如_m256_add_pd链接时间优化再次起作用。我意识到这是使用链接时优化的一个愚蠢的例子,但是在链接时优化非常有用的不同环境中出现错误。

有谁能解释这里发生了什么?

0 个答案:

没有答案