Pass:Selection
1. 目标与位置
- 位置:
backend/Selection.v
- 输入/输出:
Cminor.program →
CminorSel.program
- 目标:指令选择,识别目标 ISA 支持的复合操作与寻址模式。
2. 核心思想
- 自底向上重写表达式树,使用
SelectOp /
SelectLong 等目标相关规则。
- 将内存访问转换为目标可识别的地址模式。
- 做有限的 if-conversion,将部分分支转为条件选择指令。
3. 关键数据结构与函数
sel_unop / sel_binop:将 Cminor
的运算映射到目标相关构造器。
load / store:通过 addressing
识别寻址模式。
sel_expr /
sel_exprlist:表达式/表达式列表翻译。
condexpr_of_expr /
condition_of_expr:转换条件表达式。
sel_stmt:语句翻译。
- 程序入口:
transf_program。
4. 具体变换要点
- 复合运算选择:
- 寻址模式:
- 自动识别可用的 base+offset / base+index 等模式。
- if-conversion:
- switch 决策树:
- 将
switch 转为决策树结构(Switch
模块)。
5. 与前后 pass 的接口
- 前:
Cminorgen 输出 Cminor
- 后:
RTLgen(CFG 与 RTL 生成)
6. 常见边界与约束
- 目标相关规则决定可用变换;不支持时回退到通用形式。
- if-conversion 受启发式控制,避免代码膨胀。