c - LLVM 不使用机器指令

标签 c gcc llvm

我正在测试 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/

相关文章:

debugging - Clang 和 LLVM - 发布与调试构建

比较c中的表和使用时钟问题

c - 如何使用 C 搜索文件

c - 如何在 linux(gcc) 中将 int 转换为 char/string,反之亦然?

c++ - Makefile vpath 不适用于头文件

ios - 调试 Xcode 异常断点;未记录异常 - redux

android - 使用 NDK 编译 C++ 原生 Activity

c - 如何使用宏将宏字符串化?

c++ - volatile 结构与类型转换

c++ - 如何找到类模板成员函数定义的外层模板参数列表的SourceLocation?