当我谈论 IRs 时我谈论的是什么

主要观点:探讨编译器中间表示(IR)的设计,包括能够仅利用局部信息做决策、控制流图(CFG)、基于寄存器的 IR、静态单赋值(SSA)、延续传递风格(CPS)、类型信息、静态单信息(SSI)、节点海(SoN)、规范具体化等方面,以及这些设计的特点、优势和潜在问题,还提及可能有待探索和发明的其他概念。
关键信息:

  • 控制流图将代码分解为基本块和有向边,代表块间跳转,扩展基本块允许每个块有多个控制出口,多数编译器使用普通基本块。
  • 基于寄存器的 IR 中指令以命名输入和输出,更易移动,需处理名称定义多次的情况。
  • SSA 中每个变量只能定义一次,便于分析,与 CPS 可表示相同程序但各适用于不同语言。
  • 类型信息可注释 IR 节点,SSA 存储指令类型信息更易分析,添加类型信息时要问对问题。
  • SSI 可在 IR 内部编码新的元数据,通过细化信息来存储,可不用完全 SSI 也获得很多好处,但要注意隐含的执行顺序。
  • 节点海将每个指令作为图的顶点,显式表示数据和控制依赖,有“LearnFact”节点等。
  • 规范具体化可将操作的完整语义细化到 IR 中让优化器处理,如内联语义等。
    重要细节:
  • sumto函数为例展示控制流图的构建和转换。
  • 说明在不同 IR 形式中指令的操作和数据表示方式。
  • 提及各种 IR 设计的相关研究和实践,如 MLton 使用 SSA 等。
  • 介绍相关论文和实现,如 Ananian 的论文、Simple 等。
阅读 6
0 条评论