对于一个简单的 llvm IR:
define i32 @test(i32 %X, i32 %Y) {
%Z = udiv i32 %X, %Y
ret i32 %Z
}
SelectionDAG 图比我想象的要复杂:
为什么CopyFromReg
需要,为什么不直接连接vreg0
和vreg1
连接udiv
?
我应该如何阅读图表,从EntryToken
到GraphRoot
或相反的方向?
对于一个简单的 llvm IR:
define i32 @test(i32 %X, i32 %Y) {
%Z = udiv i32 %X, %Y
ret i32 %Z
}
SelectionDAG 图比我想象的要复杂:
为什么CopyFromReg
需要,为什么不直接连接vreg0
和vreg1
连接udiv
?
我应该如何阅读图表,从EntryToken
到GraphRoot
或相反的方向?
函数参数是特定于调用约定的,它们在SelectionDAG(SelectionDAGISel::SelectAllBasicBlocks
调用SelectionDAGISel::LowerArguments
)的构造过程中被降低,特定于体系结构的 LowerArguments 通常创建CopyFromReg
以将虚拟寄存器中的参数表示为SDValue
并将其链接CopyFromReg
到SelectionDAG。
附加的额外CopyFromRegRegisterSDNode
用于维护到 EntryToken 的链,并存储其他设计为不属于DebugLoc
.
这是一个未附加CopyFromReg的示例(缺少蓝色虚线箭头):
Entry Token 是函数的入口,用于“链接”(蓝色链接)所有有副作用的操作。我认为 CopyFromReg 和 CopyToReg 是为了实现函数的调用约定。