读取 LLVM DAG
Reading LLVM DAG
我正在尝试通过所有阶段检查 DAG,以确定指令选择哪里出错了。但是我不确定如何解释输出 DAG 中的某些符号。
首先是函数的 LLVM-ir:
define i32 @get_data() #0 {
entry:
%0 = load i32* @data, align 4
ret i32 %0
}
我 运行 llc with -debug 我看到我感兴趣的函数的初始选择 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>
我想知道上面的加载指令,特别是第三个操作运行d:
0x3902e00<LD4[@data]>
从上面我可以看出节点0x3902e00是未定义的,但是我应该如何读取'<'和'>'之间的部分?这个结构是什么意思?
所有内存操作节点也捕获受操作影响的内存引用。此引用通过 MachineMemOperand class 描述,您可以使用 getMemOperand() 调用从节点中获取它。您在里面看到的是 MachineMemOperand 的内容。这里基本上说它是 IR 值 @base.
大小为 4 的负载
有关详细信息,请参阅 MachineMemOperand::print()。它还可能包括一堆其他内容,包括偏移量、地址 space、AA 信息、加载/存储是否是非临时的等等。
我正在尝试通过所有阶段检查 DAG,以确定指令选择哪里出错了。但是我不确定如何解释输出 DAG 中的某些符号。
首先是函数的 LLVM-ir:
define i32 @get_data() #0 {
entry:
%0 = load i32* @data, align 4
ret i32 %0
}
我 运行 llc with -debug 我看到我感兴趣的函数的初始选择 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>
我想知道上面的加载指令,特别是第三个操作运行d:
0x3902e00<LD4[@data]>
从上面我可以看出节点0x3902e00是未定义的,但是我应该如何读取'<'和'>'之间的部分?这个结构是什么意思?
所有内存操作节点也捕获受操作影响的内存引用。此引用通过 MachineMemOperand class 描述,您可以使用 getMemOperand() 调用从节点中获取它。您在里面看到的是 MachineMemOperand 的内容。这里基本上说它是 IR 值 @base.
大小为 4 的负载有关详细信息,请参阅 MachineMemOperand::print()。它还可能包括一堆其他内容,包括偏移量、地址 space、AA 信息、加载/存储是否是非临时的等等。