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