用于 Scrapscript 的编译器 IR

主要观点:

  • 为 Scrapscript 编程语言添加中间表示(IR)即 SSA IR,用于优化和重写程序,其设计简单且与 LLVM 等不同,最终编译为 C 语言。
  • 介绍了 SSA IR 的样子,包括小例子(构建链表)和大例子(模式匹配),并指出存在可优化的地方,如合并基本块、去除死代码、常量折叠等。
  • 阐述了一些优化 passes,如 CleanCFG、DeadCodeElimination、SCCP 等,以及它们的实现和作用。
  • 提到更高级的优化,如基于抽象解释的分析(如活度分析、分配删除/逃逸分析等)和非抽象解释的分析(如公共子表达式消除)。
  • 讨论了选择 SSA 的设计决策,以及从 SSA 到 C 的编译过程,包括代码生成器的实现。

关键信息:

  • 新增 SSA IR 原因:AST 虽好但有局限性,新增 IR 便于优化和重写,且保持代码简单,不依赖特定 LLVM 版本。
  • IR 结构:包含函数、基本块和指令,如 Const、ListCons、Return 等,还涉及函数参数、控制流指令等。
  • 优化 passes:CleanCFG 用于合并基本块,DeadCodeElimination 用于去除死代码,SCCP 用于常量折叠等,各有其实现和作用。
  • 更高级优化:包括活度分析、分配删除等,可提升代码质量,还有其他待添加的分析。
  • 设计决策:SSA 可简化分析,通过编码元数据使分析更易,还可添加其他类似 SSA 的想法。
  • 编译到 C:代码生成器与基线编译器类似,利用 gvn/InstrId 为指令命名,目前在简单模式下 out-of-SSA。

重要细节:

  • 代码示例详细展示了 SSA IR 的构建和优化过程,如小例子中的链表构建和大例子中的模式匹配。
  • 优化 passes 的具体实现细节,如 DeadCodeElimination 中对指令的标记和删除方式。
  • SCCP 中使用两个工作列表,根据类型进行指令分析和控制流处理。
  • 提到在编译器方面的学习和实践,以及对大型慢程序用于基准测试的期待。
  • 感谢 CF Bolz-Tereick 的写作反馈。
阅读 15
0 条评论