内容提要
今年夏天,我参加了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的启发式算法。
延伸问答
NewGVN相对于GVN有哪些优势?
NewGVN能够完整处理循环,而GVN只能处理非循环代码。此外,NewGVN在内存操作的值编号方面使用MemorySSA,简化了冗余检测。
在GSoC项目中,主要贡献是什么?
主要贡献是为NewGVN开发了一个部分冗余消除(PRE)阶段,通过泛化Phi-of-Ops实现。
NewGVN的PRE实现包含哪些步骤?
PRE实现包括phi-翻译和phi-插入两个步骤。
NewGVN目前面临哪些挑战?
NewGVN面临的挑战包括缺乏关键边拆分和加载强制转换功能,以及存在一些错误。
NewGVN的性能提升如何?
我们的实现平均性能提高了0.4%,但在某些情况下表现回归,最严重的情况是jpegxl性能下降了10%。
未来的工作计划是什么?
未来的工作包括实现缺失的关键边拆分和加载强制转换功能,并优化PRE的启发式算法。