[论文解读] Simple, Light, Yet Formally Verified, Global Common Subexpression Elimination and Loop-Invariant Code Motion
本文提出了一种轻量级、形式化验证的全局公共子表达式消除与循环不变代码移动方法,应用于CompCert形式化验证编译器中,通过组合展开(unrolling)阶段与经认证的全局公共子表达式消除阶段实现。该方法在保持形式正确性的同时,以极低的证明复杂度显著提升了性能,缩小了与最先进优化编译器的差距,且证明过程具有模块化、可组合性。
We present an approach for implementing a formally certified loop-invariant code motion optimization by composing an unrolling pass and a formally certified yet efficient global subexpression elimination.This approach is lightweight: each pass comes with a simple and independent proof of correctness.Experiments show the approach significantly narrows the performance gap between the CompCert certified compiler and state-of-the-art optimizing compilers.Our static analysis employs an efficient yet verified hashed set structure, resulting in fast compilation.
研究动机与目标
- 缩小CompCert形式化验证编译器与gcc、clang等最先进优化编译器之间的性能差距。
- 以极低复杂度、可组合且形式化验证的证明方式,实现如循环不变代码移动等复杂优化。
- 在避免全SSA中间表示中间端的复杂性与性能开销的同时,保持形式正确性。
- 通过经形式化验证的哈希集合数据结构,实现高效的全局公共子表达式消除。
- 构建一个模块化、可组合且可扩展的优化流水线,避免单体化正确性证明。
提出的方法
- 该方法通过组合循环展开阶段与形式化验证的全局公共子表达式消除阶段实现。
- 通过展开第一次循环迭代,将循环不变表达式移出循环,并利用公共子表达式消除重用计算结果。
- 使用经形式化验证的高效哈希集合数据结构,加速子表达式检测并实现快速编译。
- 每项优化阶段均通过简单的局部仿真论证独立证明正确性,避免复杂的全局不变量。
- 该方法避免全SSA构造,相比SSA-based优化,显著降低了代码规模与证明复杂度。
- 该方法在CompCert中实现,并利用Coq进行形式化验证,且可信计算基(trusted computing base)极小。
实验结果
研究问题
- RQ1是否可以在不依赖全SSA-based中间端的前提下,在形式化验证编译器中实现循环不变代码移动?
- RQ2是否可以以极低的证明复杂度和高性能,实现形式化验证的全局公共子表达式消除?
- RQ3将简单、独立验证的优化阶段组合起来,是否比单体化优化阶段具有更好的性能与可维护性?
- RQ4通过轻量级、可组合的优化,是否能显著缩小形式化验证编译器与工业级优化编译器之间的性能差距?
- RQ5是否可行仅通过经验证的数据结构与模块化证明,在形式化验证编译器中实现高质量优化?
主要发现
- 所提方法显著缩小了CompCert与gcc、clang等最先进优化编译器之间的性能差距。
- 基于经验证哈希集合构建的全局公共子表达式消除阶段,在形式化验证的约束下仍实现了快速编译时间。
- 整个优化流水线(包括循环不变代码移动)的实现仅需1,500行经验证的哈希集合代码与2,700行子表达式消除代码。
- 该方法避免了先前CompCert扩展中使用的53,000行SSA中间端,显著降低了复杂度与维护成本。
- 正确性证明具有模块化与轻量化特点,尽管处理复杂数据流,子表达式消除的证明仅需2,700行代码。
- 该方法优于以往形式化验证方法(如Tristan与Leroy的惰性代码移动),后者具有三次方时间复杂度,且因成本过高从未被集成。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。