🤖 AI Summary
Source-to-source transformations—such as loop unrolling, tiling, and fusion—in compiler optimization lack reliable correctness verification, posing significant risks in high-level synthesis (HLS) and production compilers.
Method: This paper introduces the first equivalence checking framework for compiler optimizations based on e-graphs and equality saturation. It deeply integrates MLIR into the e-graph infrastructure and devises a hybrid dynamic/static rewriting strategy to achieve comprehensive functional equivalence verification.
Contribution/Results: The framework successfully verifies over 100 optimization combinations on PolyBenchC; verifies >100K lines of MLIR code within 40 minutes, exhibiting linear and predictable runtime scaling; and discovers and localizes two classes of semantics-breaking bugs in mlir-opt for the first time. By bridging a critical gap in automated equivalence verification for HLS and compiler optimizations, this work establishes a new paradigm for trustworthy compiler optimization.
📝 Abstract
In modern computing systems, compilation employs numerous optimization techniques to enhance code performance. Source-to-source code transformations, which include control flow and datapath transformations, have been widely used in High-Level Synthesis (HLS) and compiler optimization. While researchers actively investigate methods to improve performance with source-to-source code transformations, they often overlook the significance of verifying their correctness. Current tools cannot provide a holistic verification of these transformations. This paper introduces HEC, a framework for equivalence checking that leverages the e-graph data structure to comprehensively verify functional equivalence between programs. HEC utilizes the MLIR as its frontend and integrates MLIR into the e-graph framework. Through the combination of dynamic and static e-graph rewriting, HEC facilitates the validation of comprehensive code transformations. We demonstrate effectiveness of HEC on PolyBenchC benchmarks, successfully verifying loop unrolling, tiling, and fusion transformations. HEC processes over 100,000 lines of MLIR code in 40 minutes with predictable runtime scaling. Importantly, HEC identified two critical compilation errors in mlir-opt: loop boundary check errors causing unintended executions during unrolling, and memory read-after-write violations in loop fusion that alter program semantics. These findings demonstrate HEC practical value in detecting real-world compiler bugs and highlight the importance of formal verification in optimization pipelines.