llvm SDNode 介绍
指令选择
1. 数据结构与内存布局
问题是指针指向关系是前向还是后向?
后向,其实是双向。
operands指向def。但是SDUse其实是个双向链表。
2. SelectionDAG 结构介绍
作用域:block level
以这段IR为例:(参考^1)
1 | then: |
内存占用有点过于大了。。。
[[llvm_SDNode_draw.excalidraw]]
SDUse和llvm::Use同理
- chain:用于规定执行顺序
- glue:表示紧密耦合,不能被调度分开。比如ADC进位。
- EntryToken 作为block开始
-mllvm -debug-only=isel打印文本形态的DAG-mllvm -view-isel-dags打印dot格式的DAG,GraphRoot节点其实是Printer添加的。
3. 实现
ir to dag
legalize type
legalize opcode
dag isel。DoInstructionSelection,Select,X86DAGToDAGISel::Select,SelectCode(in inc file),SelectCodeCommon
指令选择的核心,match table就是一个字节码,SelectCodeCommon类似虚拟机解释器。schedule
emit
N:参考