gpt4 book ai didi

llvm - LLVM 中数组索引方式的区别

转载 作者:行者123 更新时间:2023-12-04 01:50:38 28 4
gpt4 key购买 nike

在 LLVM IR 中,当我想从一个数组中获取一个值时,似乎有三种方法可以做到这一点:使用 extractvalue、使用 extractelement 和使用 getelementptr 然后加载。

但是,根据语言引用,我不清楚在哪种情况下您应该使用哪一种。除了差异(extractvalue 还可以从 extractelement 不能访问的结构中访问成员,语法有点不同,GEP 只进行地址计算,其中 extractvalue 和 extractelement 似乎也进行内存取消引用),在这种情况下,这些指令中的每一个都是用过吗?

例如,在下面的c代码中

int arr[2];
// do some stuff with arr
int i = arr[0];

第三行在IR中可以写成:

%0 = extractvalue [2 x i32] @arr, i32 0
%0 = extractelement [2 x i32] @arr, i32 0
%0 = load i32* getelementptr inbounds ([2 x i32]* @arr, i32 0, i32 0)

如果我没记错的话,这三条 IR 线做的事情完全一样。我编译为 IR 的另一个 C 程序包含以下行

printf(" %d", a[i]);

当我用 clang 编译它时,相应的 IR 看起来像这样:

%25 = load i32, i32* %i14, align 4
%26 = load i32*, i32** %a, align 4
%arrayidx18 = getelementptr inbounds i32, i32* %26, i32 %25
%27 = load i32, i32* %arrayidx18, align 4
%call20 = invoke i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %27)

那么为什么这里使用 getelementptr 而不是 extractelement?其他指令什么时候使用?

最佳答案

在 LLVM 4.0 文档中:

extractelement 表示它特定于向量并返回所提供索引处的标量值。 (如果索引超出范围则未定义)

extractvalue 建议它对结构和数组(聚合类型)是通用的,并返回索引寻址的结构字段的值。它支持多个索引,可用于以类似于 getelementptr 中使用的索引的方式访问嵌套元素。

getelementptr(顾名思义)返回一个指向某个位置的指针,而上面的其他操作返回一个值。因此 load 指令要求获取值(或 store 如果写入)。

我正在编写一个发出 LLVM 的编译器,我已经使用 getelementptr 概括了大多数向量和聚合访问(读取和写入),以简化发出代码。然而;其他编译器可能会进行更深入的分析并生成特定于类型的 LLVM 操作。

关于llvm - LLVM 中数组索引方式的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40422032/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com