阅读LLVM DAG

时间:2015-11-11 22:26:12

标签: llvm llvm-ir

我试图通过所有阶段检查DAG,以确定指令选择出错的位置。但我不确定如何解释输出DAG中的一些符号。

首先是函数的LLVM-ir:

define i32 @get_data() #0 {
entry:
  %0 = load i32* @data, align 4
  ret i32 %0
}

我用-debug运行了llc,我看到我感兴趣的函数的初始选择DAG是:

=== get_data
Initial selection DAG: BB#0 'get_data:entry'
SelectionDAG has 8 nodes:
 0x38d60f0: ch = EntryToken

  0x3902cf0: i64 = Constant<0>

  0x3903020: i32 = Register %R1

    0x38d60f0: <multiple use>
    0x3903020: <multiple use>
      0x38d60f0: <multiple use>
      0x3902be0: i64 = GlobalAddress<i32* @data> 0 [ORD=2]

      0x3902e00: i64 = undef

    0x3902f10: i32,ch = load 0x38d60f0, 0x3902be0,   0x3902e00<LD4[@data]> [ORD=2]

  0x3903130: ch,glue = CopyToReg 0x38d60f0, 0x3903020, 0x3902f10 [ORD=3]

    0x3903130: <multiple use>
    0x3903020: <multiple use>
    0x3903130: <multiple use>

我想知道上面的加载指令,特别是第三个操作数:

0x3902e00<LD4[@data]>

我可以从上面看到节点0x3902e00未定义,但我应该如何读取&#39;&lt;&#39;之间的部分。和&#39;&gt;&#39;?这构造意味着什么?

1 个答案:

答案 0 :(得分:2)

所有内存操作节点还捕获受操作影响的内存引用。此引用通过MachineMemOperand类进行描述,您可以使用getMemOperand()调用将其从节点中删除。你在里面看到的是MachineMemOperand的内容。这里基本上它表示它是IR值@base的大小为4的负载。

有关详细信息,请参阅MachineMemOperand :: print()。它可能还包括一堆其他东西,包括偏移量,地址空间,AA信息,加载/存储是否是非时间的等等。