编译器能优化“意大利面条式代码”吗?

4

我正在编写一个生成C++代码的编译器,无法使用while/for或任何其他普通循环语句,所以我将其转换为goto/if和赋值/调用行,例如:

if (i<b) goto loop_959__again;
loop_959__end: ;
}
{
int inumber;
int i;
i=0;
inumber=3;
if (!(inumber<30)) goto loop_4482__end;
loop_4482__again:
float fnumber;
_A1__main__increase(__owner);
i++;
inumber++;
fnumber=3;
loop_4482__step_begin:
if (inumber<30) goto loop_4482__again;
loop_4482__end: ;
}

这真的很难看,但是GCC编译器能否像普通循环一样编译和优化上述代码?

1
当然可以,我只希望它永远不会被人类阅读。 - Marco A.
@MarcoA. 我觉得当代码生成出现错误时,我可能会去看一下这段代码。但是有源代码吗?对于这个项目来说,这真的很重要。或者说这个问题太琐碎了,不需要源代码吗?我试着想了一个检查的方法,但是感到困惑。 - KugBuBu
抱歉,我没有理解您之前的陈述。 - Marco A.
2
请检查它。使用优化标志编译它并检查汇编代码是否在优化编译中更短。 - Jepessen
为什么要猜测?将其编译为汇编代码(打开适当的优化选项),并检查汇编代码。 - NPE
显示剩余16条评论
1个回答

10
编译器通过流图分析来优化程序控制流,从编译器的角度来看,在该级别使用goto代替if分支实际上是等效的。
需要注意的是:由于goto可以跳转到函数中几乎任何地方,如果您的生成器生成了不可约控制流图,那么这可能会影响编译器的优化能力。

我记得在某个地方读到过,goto语句可能会使得特定行是否被执行的问题变得不可判定。难道我错了吗? - Patrick Collins
关于“不可约控制流图”,我在哪里可以找到一个例子?这将有助于了解什么是不应该做的。 - KugBuBu
通过在任何编译器构建书籍中查找或通过谷歌搜索讲座,您可以了解有关@KugBuBu的知识。如果您对此感兴趣,我还建议查看LLVM的源代码(搜索CFG分析模块)。 - Marco A.
@MarcoA。没事了,我在实际文章中找到了一个,抱歉。 - KugBuBu
@PatrickCollins 我记得在某个地方有一篇论文,可能是在 saarland.de (http://www.cdl.uni-saarland.de/publications/) 上,深入研究了这个问题。我会看看能否找到它。 - Marco A.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接