GCC既不下沉分配也不消除部分无效代码

时间:2019-06-20 09:39:43

标签: c gcc compiler-optimization dead-code

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

可以将部分无效代码视为两次选择通过的结果:分配沉陷 + 无效代码。例如

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是否应用了分配沉没 / 部分无效代码

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

1 个答案:

答案 0 :(得分:0)

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