读取LLVM DAG

读取LLVM DAG,llvm,llvm-ir,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' SelectionD

我试图在所有阶段检查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>
==获取数据
初始选择DAG:BB#0“获取数据:条目”
SelectionDAG有8个节点:
0x38d60f0:ch=EntryToken
0x3902cf0:i64=常数
0x3903020:i32=寄存器%R1
0x38d60f0:
0x3903020:
0x38d60f0:
0x3902be0:i64=全局地址0[ORD=2]
0x3902e00:i64=未定义
0x3902f10:i32,ch=加载0x38d60f0,0x3902be0,0x3902e00[ORD=2]
0x3903130:ch,glue=CopyToReg 0x38d60f0,0x3903020,0x3902f10[ORD=3]
0x3903130:
0x3903020:
0x3903130:
我想知道上面的load指令,特别是第三个操作数:

0x3902e00<LD4[@data]>
0x3902e00

我可以从上面看出节点0x3902e00未定义,但如何读取“”之间的部分?这个构造意味着什么?

所有内存操作节点也捕获受操作影响的内存引用。这个引用是通过MachineMoPerand类描述的,您可以使用getMemorAnd()调用从节点中获取它。你在里面看到的是机器和机器的内容物。这里基本上说,它是一个大小为4的负载,IR值为@base

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