强制 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
}
编译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
}