如何为堆栈机编写 LLVM 后端?
How to write an LLVM backend for stack machine?
当我尝试构建 LLVM 后端而不在 TableGen 文件中定义 RegisterClass
个实例时,它会抛出以下错误:
error:No 'RegisterClass' subclasses defined
如何为 LLVM 定义堆栈机器目标(即不使用寄存器)?
只是不要这样做。 LLVM DAG是专门为寄存器机设计的,对堆栈机编译有一点价值。您需要一个自定义后端。
我用于解决类似问题(LLVM IR -> FPGA 上的堆栈软核)的一种方法如下:
1) 超出 SSA (reg2mem)
2) 构建中间树表示(即,如果顺序允许,将所有一次性寄存器分配压缩到树中)。这是主要的优化瓶颈,你留下的寄存器分配越少越好。
3) "Register allocation" 其余寄存器现在全部表示为堆栈分配的变量(希望您的堆栈计算机 ISA 允许)。
4) 直接翻译树,无需任何指令选择(您可以在 LLVM IR 级别上执行此操作,而不是使用内在函数和自定义 instcombine pass)。
编辑:使用基于 DAG 的后端做到这一点并不容易,它从来没有打算以这种方式使用。
我能想到的最接近的事情是使用 DAG 后端生成中间寄存器机器代码,然后使用 post-processing pass 尽可能地重新排序指令并注入堆栈否则分配变量访问。即,将每个堆栈机器指令表示为具有 1 或 2 个寄存器参数和 1 个寄存器结果的伪指令。
虽然我同意不要这样做的警告,但您应该看看 WebAssembly 后端。
https://github.com/llvm/llvm-project/tree/main/llvm/lib/Target/WebAssembly
当我尝试构建 LLVM 后端而不在 TableGen 文件中定义 RegisterClass
个实例时,它会抛出以下错误:
error:No 'RegisterClass' subclasses defined
如何为 LLVM 定义堆栈机器目标(即不使用寄存器)?
只是不要这样做。 LLVM DAG是专门为寄存器机设计的,对堆栈机编译有一点价值。您需要一个自定义后端。
我用于解决类似问题(LLVM IR -> FPGA 上的堆栈软核)的一种方法如下:
1) 超出 SSA (reg2mem)
2) 构建中间树表示(即,如果顺序允许,将所有一次性寄存器分配压缩到树中)。这是主要的优化瓶颈,你留下的寄存器分配越少越好。
3) "Register allocation" 其余寄存器现在全部表示为堆栈分配的变量(希望您的堆栈计算机 ISA 允许)。
4) 直接翻译树,无需任何指令选择(您可以在 LLVM IR 级别上执行此操作,而不是使用内在函数和自定义 instcombine pass)。
编辑:使用基于 DAG 的后端做到这一点并不容易,它从来没有打算以这种方式使用。
我能想到的最接近的事情是使用 DAG 后端生成中间寄存器机器代码,然后使用 post-processing pass 尽可能地重新排序指令并注入堆栈否则分配变量访问。即,将每个堆栈机器指令表示为具有 1 或 2 个寄存器参数和 1 个寄存器结果的伪指令。
虽然我同意不要这样做的警告,但您应该看看 WebAssembly 后端。
https://github.com/llvm/llvm-project/tree/main/llvm/lib/Target/WebAssembly