【问题标题】:GCC is neither sinking assignements nor eliminating partial dead codesGCC 既不下沉分配也不消除部分死代码
【发布时间】:2019-06-20 09:39:43
【问题描述】:

我正在尝试查看 GCC 是否应用了部分死代码消除优化。

部分死代码消除可以被认为是两个选择通过的结果:assignment sinking + 死代码消除。例如

x = 3;                                   
y = p + q;                       y = p + q;                       y = p + q;
if(cond) then                    if(cond) then                    if(cond) then
    x = 5;       assn sinking        x = 3;     dead code eln         x = 5;
    p = p*q;     ----------->        x = 5;     ------------->        p = p*q;
else                                 p = p*q;                     else
    q = p*q;                     else                                 x = 3;
end if;                              x = 3;                           q = p*q;
out(x);                              q = p*q;                     end if;
                                 end if;                          out(x)
                                 out(x)

我尝试了以下方法。

备注:我所有的观察都是基于 Gimple 级别的转储文件,而不是 RTL 级别。

我电脑上的 GCC 版本:gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0.

我尝试使用以下命令编译我的代码:

gcc -O3 -fdump-tree-all pde.c

我收到以下dump files。根据 GCC 7.4.0 文档,有一个名为 pde.c.134t.sink 的地方预计会看到前向存储动作。但我无法在任何 gimple 级转储文件中找到任何类型的代码运动。我不确定它是否在 RTL 级别进行代码运动?我已经尝试了很多基准测试,但我从未在 Gimple 级别看到分配下沉/部分死代码消除。

问题1: GCC 是否应用assignment sinking / 部分死代码消除

问题2:如果是,那么我在哪里可以看到这个?

【问题讨论】:

    标签: c gcc compiler-optimization dead-code


    【解决方案1】:

    看起来您用作参考源的任何内容都没有遵循静态单一分配 (SSA) 形式。在很早的阶段,GCC 将程序转换为 SSA 形式(在ssa 传递中)。在 SSA 形式中,这种分配下沉是不相关的,因为下沉隐含在 phi 节点的工作方式中。如果在转换为 SSA 形式之前执行 assignment sinking,只会增加 SSA 名称的数量,从而为以后的优化创造更多工作。

    【讨论】:

    • 对不起,我无法理解你在说什么。我提到了GCC slides (slide-6)。它说在创建 Gimple 文件后进行了一些优化,并在创建 RTL 文件后启用了一些优化。我验证了 Gimple 文件(无论是否发生 pde/assn 下沉),但很难验证 RTL 文件是否相同。你能详细说明你的答案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多