【发布时间】:2016-02-05 22:56:27
【问题描述】:
将值存储到指向聚合类型的指针时,getelementptr 和 store 与 load 和 insertvalue 有什么区别?在某些情况下是首选吗?如果是这样,为什么?还是我完全走错了方向?
示例:
; A contrived example
%X = type {i32, i64}
define i32 @main(i32 %argc, i8** %argv) {
entry:
%sX.0 = alloca %X
; change the first value with GEP + store
%val1 = getelementptr %X, %X* %sX.0, i32 0, i32 0
store i32 42, i32* %val1
; change the second value with load + insertvalue
%sX.1 = load %X, %X* %sX.0
%sX.2 = insertvalue %X %sX.1, i64 42, 1
store %X %sX.2, %X* %sX.0 ; I suppose this could be considered less than ideal
; however in some cases it is nice to have the
; struct `load`ed
ret i32 0
}
使用llc -O=0 ... 很有趣,它们都编译为相同的指令。相当于以下内容,这是我所希望的。
movl $42, -16(%rsp) # GEP + store
movq $42, -8(%rsp) # load + insertvalue
背景:
我正在阅读LLVM Language Reference,我正在阅读有关insertvalue 的信息。参考文献指出了extractvalue 指令与GEP 的相似性以及以下差异。
getelementptr 索引的主要区别是:
由于被索引的值不是指针,所以第一个索引被省略并假定为零。
必须至少指定一个索引。
不仅结构索引,数组索引也必须在范围内。
StackOverflow 上的以下问题也提到了getelementptr 和insertvalue 的使用,但原因不同。 LLVM insertvalue bad optimized?
【问题讨论】: