【问题标题】:How to see compiler reformulation of C++ code with optimizations如何通过优化查看 C++ 代码的编译器重构
【发布时间】:2017-07-28 06:25:15
【问题描述】:

我想知道在打开优化时是否/如何查看编译器如何使用 clang++/g++ 重新编写一段代码。我知道英特尔编译器有一个标志可以产生相关的输出,但我似乎在其他编译器中找不到等价物。

【问题讨论】:

  • 假设你想看汇编代码,这里是一个快速的例子:godbolt.org
  • 我认为这更直接一点:stackoverflow.com/questions/137038/…
  • 这很方便,谢谢。我对更易于阅读的东西更感兴趣,即编译器做出了哪些优化决策以及在哪里,当然适用的地方......!
  • 我不知道。从来没有见过,所以我要撤退并潜伏,因为如果它存在,我有兴趣自己玩它。
  • 编译器优化通常是难以理解的,除非您对汇编语言有基本的掌握。确实没有太多方法可以解决这个问题。

标签: c++ g++ clang compiler-optimization


【解决方案1】:

编译器不优化 C++ 代码;编译器将 C++ 转换为实现定义的“内部表示”并对其进行优化。然后他们将其转换为您的 CPU 可以执行的代码,并可能进一步优化

(请记住:C++ 是一种抽象;您的 C++ 代码定义了程序的语义。您的计算机不会将其用作一系列实际指令来执行。)

因此,没有“优化的 C++”供您阅读;您只能查看生成的程序集并将其与您说服编译器不要如此积极优化的构建中的程序集进行比较。使用 LLVM,您也许可以了解内部表示本身,但我对此了解不多。

【讨论】:

  • 我不确定是否所有优化都发生在内部表示上,IIRC GCC 已经或已经在生成的程序集上运行了一些优化,这是因为内部表示不是针对任何单一架构的。这意味着您生成的 x86 程序集最终会丢失一些特定的快捷方式,然后您将使用了解这些特定 x86 技巧的窥视孔优化器进行修复。
  • @MSalters:已添加
  • @LightnessRacesinOrbit 这并不完全准确,因为编译器做了很多具有象征意义的优化,例如,删除死代码、将变量移出循环、循环矢量化,所以我正在寻找的是一种查看每个决定是在哪里做出的方法。这不是我想要的重新表述,但它已经足够接近了:)
【解决方案2】:

所以,感谢您的指导,我发现了一些非常酷的东西,所以我想分享一下:

使用 Clang++-4.0,可以如下编译可执行文件:

clang++-4.0 -std=c++14 -O3  -fsave-optimization-record -foptimization-record-file=myOptfile.yaml sourceFile.cpp

这会在 myOptfile.yaml 中保存成功和不成功优化的记录。这可以使用 llvm-opt-report-4.0 查看,但它的真正威力是使用 llvm/utils/opt-viewer.py 查看。

为此,请克隆 llvm 存储库,导航到您的源目录,并在生成 myOptFile.yaml 后运行以下命令:

python ~/myInstallDir/llvm/utils/opt-viewer/opt-viewer.py myOptFile.yaml reportsDirectory/

这将创建许多 html 文件,您可以使用 index.html(在 reportsDirectory 文件夹中)导航这些文件。

结果很棒,看起来像这样:

大部分内容都是可点击的,因此您可以使用 html 超链接导航到源代码的其他部分,包括 c++ 库,看看发生了什么!

【讨论】:

【解决方案3】:

查看汇编输出

这是一个并排查看此功能和功能着色的网站: Compiler explorer
一次可以比较多个编译器(与版本)。

GCC:How to Save the Assembler Code Generated by GCC

Clang 是作为 GCC 的替代品而设计的,因此可以使用相同的参数。
-S 将汇编代码输出到 .s 文件中
-O3 是优化级别 3

例子:

clang -S test.cpp -o test_clang_O3.s
g++ -S test.cpp -o test_gcc_O3.s
clang -O3 -S test.cpp -o test_clang_O3.s
g++ -O3 -S test.cpp -o test_gcc_O3.s


查看优化

要查看 gcc 优化,您必须检查“fdump”和“fopt”开关: GCC Debugging-Options
(示例:-fopt-info-optimized -> 成功应用优化时打印信息。)

对于 Clang,它是“发出”优化报告: Clang - Options to Emit Optimization Reports

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2016-02-14
    • 2010-12-02
    • 2013-03-11
    • 1970-01-01
    • 2010-10-02
    相关资源
    最近更新 更多