[Compiler] 方舟编译器MapleIR基本套路

文章目录[隐藏]

其中有两点值得注意:

  • 和LLVM一样,都是弄进一个IR统一调配进行lexical和semantic 的优化。
  • 方舟原生可执行。

Source Code已给,bug一堆。

从这张图当中,我们发现华为创新性地加入了M2M作为mid-end。

1.“M2M”(所有组件都是开源的)

语言特定降低,VTable生成,异常处理和类级分析。

2. 中端(只有一些的组件是开源的)

SS SA构造,参考计数(RC)插入,别名分析,“mplt处理” , RC优化,部分冗余消除(PRE),内联,副作用分析,去虚拟化,空指针消除,死代码消除(DCE), 边界检查消除,逃逸分析,复制传播,“跨语言优化”。等。

3. 后端(无组件是开源的)

堆栈分配,控制流优化,“EBO”优化,窥视孔,寄存器分配(RA)。等。

好的,我们知道后端,我们知道大多数中端优化,但......究竟什么是“M2M”阶段?

对于大多数中端优化,我认为是阶段化,而另一个IR(他们只是称之为Me)。现在让我们深入了解它们。

编译器 IR 设计

正如我们提到的,有两层IR:MAPLE和Me。他们在MAPLE上有相当不错的文档和规范,但基本上没有我的文档。

MAPLE是一个高级IR,表示与原始源代码关闭的概念。有三个重要的构建块:

  • Leaf 节点可以表示“存储”(例如,存储器块)的常数或地址/标识。
  • Expression 节点根据其操作数评估新值。他们不会产生任何副作用
  • Statement 节点通常用于表示控制流,例如循环和分支,或对存储单元的修改(例如,将值分配给存储)。

Maple IR 首先把不同语言lower成一个中间语言,再进行语言有关的优化。 它还将来自不同语言的共同特征组合成单个表示,这样编译器也可以执行与语言无关的优化。

除此之外,OpenArk基本上在同一组优化和分析中使用Me IR,您可以在其他编译器框架中找到:Alias Analysis,Dominator Tree,Dead Code Eliminations ...

Summary

OpenArk是一个编译器框架,它尝试将不同的语言编译为公共中间层并生成本机二进制文件。 它采用多层IR设计,可以在不同的抽象级别进行优化和分析。更多源代码和(英文)文档即将发布。

https://github.com/oracle/graal/tree/master/truffle https://doc.ecoscentric.com/gnutools/doc/gccint/GENERIC.html#GENERIC