我正在测试 LLVM 与 gcc 生成的代码的质量
我有一个这样的小程序
#include<math.h>
double mysqrt(double a){
return sqrt(a);
}
int main()
{
mysqrt(0.1);
return 1;
}
Clang 发出声音
mysqrt: # @mysqrt
# BB#0: # %entry
jmp sqrt # TAILCALL
这意味着它正在调用 sqrt 函数
gcc 正在发出
mysqrt:
.LFB25:
.cfi_startproc
subl $28, %esp
.cfi_def_cfa_offset 32
fldl 32(%esp)
fld %st(0)
fsqrt
fucomi %st(0), %st
这意味着它使用直接机器指令 fsqrt(我想这比调用函数快得多)。这是针对具有 O3 优化级别的 X86 机器完成的。有人知道为什么 LLVM 调用函数而不是使用机器指令吗?
最佳答案
gcc 的行为不是标准 C,因为内联调用缺少错误检查。要使 gcc 具有符合标准的行为,请使用选项 -std=c99
或类似选项进行编译。要强制 clang 忘记其标准合规性,-ffast-math
之类的东西可能会有所帮助。
关于c - LLVM 不使用机器指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20518480/