强制 clang 生成内在 cos

Force clang to generate intrinsic cos

编译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 而不是 @cos 获取 llvm 内在函数 @llvm.fcos.f64,即生成的代码应该是这样的

  ...
  %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
}