通过分析程序集列表验证gcc/g ++中的编译器优化

Vic*_*Liu 11 c c++ compiler-construction assembly micro-optimization

我刚刚问了一个与编译器如何优化某些C++代码有关的问题,我正在寻找有关如何验证编译器是否已执行某些优化的任何问题.我试图查看用g ++(g++ -c -g -O2 -Wa,-ahl=file.s file.c)生成的汇编列表,可能会看到底层发生了什么,但输出对我来说太神秘了.人们使用什么技术来解决这个问题,是否有任何关于如何解释优化代码的汇编列表或特定于GCC工具链的文章的讨论这个问题的参考?

eph*_*ent 20

GCC的优化传递以一种称为GIMPLE的格式处理代码的中间表示.

使用-fdump-*选项系列,您可以要求GCC输出树的中间状态.

例如,将此提供给 gcc -c -fdump-tree-all -O3

unsigned fib(unsigned n) {
    if (n < 2) return n;
    return fib(n - 2) + fib(n - 1);
}
Run Code Online (Sandbox Code Playgroud)

并观察它逐渐从简单的指数算法转换为复杂的多项式算法.(真!)


Pau*_*l R 5

一个有用的技术是在一个好的采样分析器下运行代码,例如 Linux 下的 Zoom 或 Mac OS X 下的 Instruments(使用 Time Profiler 仪器)。这些分析器不仅向您显示代码中的热点,还将源代码映射到反汇编对象代码。突出显示源代码行会显示映射到源代码行(反之亦然)的生成代码行(不一定是连续的)。在线操作码参考和优化技巧是一个不错的奖励。

  • Zoom ( http://rotateright.com ) 还可以静态分析 ELF 二进制文件,因此您甚至不需要运行/分析代码来验证编译器是否生成了您期望的 asm。 (2认同)

Pet*_*ham 3

不是 gcc,但在 Visual Studio 中调试时,您可以选择散布程序集和源代码,这可以很好地了解为哪些语句生成了哪些内容。但有时它并没有完全正确对齐。

gcc 工具链的输出objdump -dS并不具有相同的粒度。 这篇关于让 gcc 输出源代码和程序集的文章与您使用的选项相同。