Pass:CSE
1. 目标与位置
- 位置:
backend/CSE.v
- 输入/输出:
RTL.program → RTL.program
- 目标:公共子表达式消除(CSE),避免重复计算。
2. 核心思想
- 使用值编号(value numbering)在 CFG 上做前向数据流分析。
- 以
CSEdomain 表示等价计算,维护 rhs →
valnum 的映射。
- 结合
ValueAnalysis 处理内存相关的等价性与别名。
3. 关键数据结构与函数
numbering:值编号集合(寄存器/表达式对应)。
find_rhs /
add_rhs:查找或登记计算结果。
kill_*:遇到 store/call 时失效相关等价。
transfer / analyze:Kildall
数据流求解。
transf_instr /
transf_program:变换入口。
4. 具体变换要点
- 寄存器替换:
- 若已有等价结果寄存器,替换为 move 或直接使用。
- 内存副作用处理:
- store / memcpy / call 会杀死相关 load 等价。
- 轻量计算清理:
kill_cheap_computations 避免无限积累 trivial rhs。
5. 与前后 pass 的接口
6. 常见边界与约束
- 内存别名不确定时保守处理。
- 只对“可证明等价”的表达式做替换。