编译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/