Pass:Inlining
1. 目标与位置
- 位置:
backend/Inlining.v
- 输入/输出:
RTL.program → RTL.program
- 目标:内联小函数,减少调用开销并暴露更多优化机会。
2. 核心思想
- 先通过
inlining_analysis +
should_inline(OCaml 实现)筛选可内联函数。
- 使用 CFG 复制 + 偏移的方式将被调用函数插入调用点。
- 通过
context 进行 PC/寄存器/栈偏移的统一重定位。
3. 关键数据结构与函数
funenv:可内联函数的映射表。
state:构造新 CFG
的状态(nextreg/nextnode/code/stacksize)。
context:描述内联时的偏移规则与返回处理。
inline_function /
inline_tailcall:普通调用与尾调用内联。
expand_function:迭代展开所有可内联点。
transf_program:程序级入口。
4. 具体变换要点
- 递归与终止性:
- 栈大小扩展:
- 内联可能增加栈需求,
st_stksize 追踪并更新。
- 返回值处理:
5. 与前后 pass 的接口
- 前:
Tailcall 处理后的 RTL
- 后:
Renumber(CFG 重编号)
6. 常见边界与约束
- 内联决策依赖 OCaml 端启发式;Coq 端仅执行内联动作。
- 对栈地址、寄存器与标签必须进行一致重定位。