5

对于一个简单的 llvm IR:

define i32 @test(i32 %X, i32 %Y) {
    %Z = udiv i32 %X, %Y
    ret i32 %Z
  }

SelectionDAG 图比我想象的要复杂:

SelectionDAG 图的图像

为什么CopyFromReg需要,为什么不直接连接vreg0vreg1连接udiv

我应该如何阅读图表,从EntryTokenGraphRoot或相反的方向?

4

2 回答 2

3

函数参数是特定于调用约定的,它们在SelectionDAGSelectionDAGISel::SelectAllBasicBlocks调用SelectionDAGISel::LowerArguments)的构造过程中被降低,特定于体系结构的 LowerArguments 通常创建CopyFromReg以将虚拟寄存器中的参数表示为SDValue并将其链接CopyFromRegSelectionDAG

附加的额外CopyFromRegRegisterSDNode用于维护到 EntryToken 的链,并存储其他设计为不属于DebugLoc.

这是一个未附加CopyFromReg的示例(缺少蓝色虚线箭头):

在此处输入图像描述

于 2014-12-19T10:33:34.720 回答
2

Entry Token 是函数的入口,用于“链接”(蓝色链接)所有有副作用的操作。我认为 CopyFromReg 和 CopyToReg 是为了实现函数的调用约定。

于 2014-12-14T05:03:47.837 回答