clang - 强制 clang 生成内在 cos

标签 clang llvm intrinsics trigonometry

编译cos.c

void func() {
    double a = __builtin_cos(3.0);
}

使用

clang -S -emit-llvm -c cos.c

我有

define dso_local void @func() {
  %1 = alloca double, align 8
  %2 = call double @cos(double 3.000000e+00)
  store double %2, double* %1, align 8
  ret void
}


declare dso_local double @cos(double)

但我想获取 cos 的 llvm 内在函数 @llvm.fcos.f64 而不是 @cos,即生成的代码应该就这样吧

  ...
  %2 = call double @llvm.fcos.f64(double 3.000000e+00)
  ...
}

declare double @llvm.cos.f64(double)

我怎样才能强制clang这样做?也许我应该使用另一个函数而不是 __builtin_cos

最佳答案

使用-ffast-math(意味着-fno-math-errno),clang -O3__builtin_cos 内联到 @llvm.cos.f64

double func(double in) {
    double a = __builtin_cos(in);
    return a;
}

clang -O3 -ffast-math -emit-llvm on Godbolt (删除了调试内容)

define dso_local double @_Z4funcd(double) local_unnamed_addr #0 !dbg !7 {
  %2 = tail call fast double @llvm.cos.f64(double %0), !dbg !15
  ret double %2, !dbg !17
}

关于clang - 强制 clang 生成内在 cos,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53638273/

相关文章:

C 源代码包含名称长度

llvm - LLVM Pass 可以用来更改代码吗?

c++ - 将 LLVM 添加到我的 Cmake 项目 : Why are there hardcoded paths in LLVM's Cmake file?

c++ - 如何使用 AVX 内在函数 C++ 将 3 个浮点 vector 交错到一个数组中

c++ - 了解 SSE 的内在函数如何使用内存

c++ - 如何在全局范围内添加包含路径到 clang

c++ - ThreadSanitizer (tsan) - 来自共享库的有意义的信息

c - NEON 将 vector 比较结果打包为位图

c++ - C++ 中的 Clang vector 扩展和相等运算符

llvm - LLVM中级代表是什么?