PGO如何应用于源代码?它如何影响CFG?

时间:2015-09-28 17:57:00

标签: gcc clang compiler-optimization control-flow-graph pgo

最近我一直在搜索PGO的相关主题,并开始想知道它们是如何应用于源代码的,并且已经应用​​了一个又一个的应用程序效果。

我的意思是,如果你在GCC或CLang中启用PGO优化,它会应用所有优化(内联,虚拟呼叫推测,死代码分离等),对吧!?

即使它们都没有应用于源代码,也可以假设它们中的一些是。然后,我猜它们是按顺序应用的,对吗?

那么,他们可以将CFG(控制流图)修改为某些基本块频率丢失的程度吗?

例如,如果PGO命名为" B"在名为" A"和" A"的PGO之后应用。修改了源代码,以便丢失一些基本块频率," B"应用(假设两者都是依赖于BB频率的PGO)?

(抱歉我的英语不好)

1 个答案:

答案 0 :(得分:1)

PGO和大多数其他优化都没有应用于源代码,它们应用于中间代码。源代码本身保持不变。但是,生成的二进制代码将(希望)优化。

PGO的目的是提高传统优化的有效性,包括内联,虚拟调用推测和很少执行的代码分离。所以它们仍然适用。你猜对了,它们是按照一些连续的顺序应用的。

其中一些优化会改变代码的CFG。但是,编译器会跟踪已分析的原始基本块,即使它们在中间代码中的位置已更改。在PGO中,编译器永远不会删除任何基本块。但是,编译器可以保持基本块相同,更改其位置,将基本块扩展为多个基本块或插入新的基本块。无论它做什么,它都会跟踪原始配置文件的基本块及其执行统计信息,以便进一步优化知道如何使用配置文件。如果插入了新的基本块,则无需使用配置文件即可正常优化。