编译器优化验证与模型检查技术
1. 基于等式的 LLVM 翻译验证器
1.1 背景与动机
编译器优化在软件开发中至关重要,它能让程序员以更高的抽象层次编写程序,同时避免性能损失。然而,确保编译器优化的正确性是一个挑战。翻译验证是提高编译器优化可靠性的一种技术,即在每次优化运行后,使用翻译验证器来验证优化后的程序是否与原始程序等价。
此前开发了一种名为等式饱和的技术和名为 Peggy 的工具,用于推理程序等价性,并证明了其在 Soot 编译器翻译验证中的有效性。受相关研究启发,将 Peggy 工具进行了更新,使其可用于 LLVM 编译器的翻译验证。
1.2 Peggy 工具更新
为了让 Peggy 能用于 LLVM 的翻译验证,开发了几个新的、特定于 LLVM 的组件:
- LLVM 前端 :用于等式饱和引擎使用的中间表示。
- 新公理 :用于引擎推理 LLVM 的加载、存储和调用操作。
- 更新的常量折叠器 :考虑了 LLVM 运算符。
1.3 翻译验证示例
示例 1
以下是原始代码和优化代码:
// 原始代码
int f(p,t) {
*p := t;
*p := *p | (t & 4);
return 0;
}
// 优化代码
int g(p,t) {
*p := t | (t & 4);