💡
原文英文,约1200词,阅读约需5分钟。
📝
内容提要
今年夏天,我参加了LLVM编译器基础设施的GSoC项目,目标是改进NewGVN pass,使其能够取代GVN成为LLVM中的主要值编号pass。NewGVN相对于GVN的优势在于完整处理循环,而GVN只能处理非循环代码。我们的主要贡献是为NewGVN开发了一个PRE阶段,通过泛化Phi-of-Ops来实现。我们的实现相比GVN平均性能提高了0.4%,但仍存在一些回归问题。未来的工作包括实现缺失的关键边拆分和加载强制转换功能,并优化PRE的启发式算法。
🎯
关键要点
- 今年夏天,我参加了LLVM编译器基础设施的GSoC项目,目标是改进NewGVN pass。
- NewGVN相对于GVN的优势在于完整处理循环,而GVN只能处理非循环代码。
- NewGVN通过乐观假设处理循环,能够发现循环不变的值。
- NewGVN在内存操作的值编号方面使用MemorySSA,简化了内存操作之间的冗余检测。
- 尽管NewGVN有多项改进,但仍未广泛使用,主要是因为缺乏部分冗余消除(PRE)和存在错误。
- 我们的主要贡献是为NewGVN开发了一个PRE阶段,通过泛化Phi-of-Ops实现。
- PRE的实现包括phi-翻译和phi-插入两个步骤。
- 集成PRE使得NewGVN能够免费获得循环不变代码移动(LICM)。
- 当前PRE实现缺少关键边拆分和加载强制转换功能。
- 我们的实现平均性能提高了0.4%,但在某些情况下表现回归。
- 未来的工作包括实现缺失的功能并优化PRE的启发式算法。
➡️