如何为堆栈机编写 LLVM 后端?

Kol*_*oDS 5 compiler-construction compilation llvm

当我尝试构建 LLVM 后端而不RegisterClass在 TableGen 文件中定义实例时,它会引发以下错误:

error:No 'RegisterClass' subclasses defined
Run Code Online (Sandbox Code Playgroud)

如何为 LLVM 定义堆栈机器目标(即不使用寄存器)?

SK-*_*gic 4

只是不要这样做。LLVM DAG是专门为寄存器机设计的,对于堆栈机编译来说价值不大。您需要一个自定义后端。

我用于解决类似问题的一种方法(LLVM IR -> FPGA 上的堆栈软核)如下:

1) 出于 SSA (reg2mem)

2) 构建中间树表示(即,如果顺序允许,将所有一次性寄存器分配压缩到树中)。这是主要的优化瓶颈,留下的寄存器分配越少越好。

3) 其余寄存器的“寄存器分配”现在全部表示为堆栈分配变量(希望您的堆栈机 ISA 允许)。

4) 直接转换树,无需任何指令选择(您可以在 LLVM IR 级别上执行此操作,而不是使用内在函数和自定义 instcombine 传递)。

编辑:使用基于 DAG 的后端来做到这一点并不容易,它从来就不是为了以这种方式使用的。

我能想到的最接近的事情是使用 DAG 后端生成中间寄存器机器代码,然后使用后处理通道在可能的情况下重新排序指令,否则注入堆栈分配的变量访问。即,将每个堆栈机器指令表示为具有 1 或 2 个寄存器参数和 1 个寄存器结果的伪指令。

  • @KolesnichenkoDS DAG 中的边缘是虚拟寄存器。堆栈机要求这些边缘具有一定的顺序(并且可能需要一些复杂的溢出)。你的选择就是把所有东西都洒出来,这是非常低效的。您可以在此处查看我如何实现 LLVM IR 到堆栈机转换:https://github.com/combinatorylogic/soc/blob/master/backends/small1/emit.hl - 具有树重新排序和溢出。 (2认同)