问题标签 [peephole-optimization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
505 浏览

linux - 减少汇编指令数量

我想(手动)减少 Linux 汇编文件中的指令数量。这将基本上通过在抽象语法树中搜索预定义的缩减来完成。

例如:

将被删除,因为它没有任何意义。

或者:

会变成:

我正在寻找涉及固定数量指令的其他优化。我不想搜索指令的动态范围。

你能推荐其他可以用更少指令替换的类似模式吗?

后来编辑:感谢 Richard Pennington,我发现我想要的是窥视孔优化。

所以我把这个问题改写为:关于 Linux 汇编代码的窥孔优化建议。

0 投票
3 回答
498 浏览

java - java peephole optimization beginner compilers

As part of a group project I'm writing a compiler for a simplified language. As one of the optional features I thought I'd add a peephole optimizer to go over the codegen's output intel assembly code and optimize it.

Our compiler is done in java and it seems like it's going to be a lot of work to create this peephole optimizer using the java I've learned so far. Is there some sort of tool I should be using to make this possible, as pattern matching strings doesn't sound like a good approach in java.

thanks

0 投票
2 回答
1780 浏览

design-patterns - 窥孔优化模式

我一直在阅读本地优化编译器技术,但一直不知道它们是如何实现的。这个想法是优化器每次都会查看代码的“窗口”,并以某种方式检测模式并用更优化的版本替换它们。

我的问题是,如何发现这些模式?(假设您的平台是一个为组装计算机输出汇编代码的 VM,例如 Schocken's Hack)。

人们是否真的手动检查代码(使用控制流图或 DAG 或其他),然后收集所有识别的模式并将它们编码到优化器中?或者有没有自动的方法。

例如,您在分析器中输入要优化的代码,它会喷出所说的模式。如果是这样,一个人如何开始写一个?

0 投票
0 回答
311 浏览

c++ - 是什么阻止了编译器对表达式模板进行窥视孔优化?

我有下面列出的代码:

其中va1va2是两个valarray<int>对象,k是 和 的va1大小va2。我期待的是编译器优化如下printf行:

但相反,英特尔编译器 (13.1) 和 CLang (3.4) 都没有进行此类优化。例如,英特尔编译器输出汇编代码:

其中r13存储 的值kr14和分别是和r12的内存的开始。是迭代器变量。从代码来看,它的作用是:va1va2r15i

为什么它没有优化(即使使用 -O3)

通过窥视孔优化?Gcc 4.8.2 在这种情况下进行了优化,但无法处理-(va1[i]+va2[i])+(va1[i]-va2[i]).

看起来一个可能的原因是在前面显示的代码中使用了表达式模板。现在的问题是,为什么编译器在完美之前就停止了优化?表达式模板如何阻止向前迈出一步?

注意 嗯,答案总是“因为编译器不是为进行优化而设计的”。但是据我从龙书上了解到,编译器应该迭代地进行优化,直到它不能做任何更好的事情。

0 投票
1 回答
380 浏览

gcc - GCC 中窥视孔和窥视孔 2 的区别

我正在浏览 GCC 中 ARM 目标的机器描述文件。在研究它时,我发现它支持的窥视孔定义(define_peephole2)是窥视孔2,而不是窥视孔。

那么有人可以告诉我窥视孔和窥视孔2之间的区别吗?