什么时候在LLVM中使用load、store和alloca

什么时候在LLVM中使用load、store和alloca,c,llvm,C,Llvm,我正在查看LLVM,以了解它们如何使用load、store和alloca。在下面的第一张幻灯片中,它们没有任何用处。第二种方法是使用alloca 我不熟悉C语言,所以我必须提高自己的速度,以便运行一个示例并自己解决这个问题,但我想问问是否有人已经知道了。不确定要编写的示例C代码的类型,以确定在LLVM中使用load、store和alloca的输出 问题是,当LLVM使用load、store和alloca时 想知道加载/存储是否也是必要的,或者LLVM可以不用它 图1↓ 图2↓ 如果不进行优化,

我正在查看LLVM,以了解它们如何使用
load
store
alloca
。在下面的第一张幻灯片中,它们没有任何用处。第二种方法是使用
alloca

我不熟悉C语言,所以我必须提高自己的速度,以便运行一个示例并自己解决这个问题,但我想问问是否有人已经知道了。不确定要编写的示例C代码的类型,以确定在LLVM中使用
load
store
alloca
的输出

问题是,当LLVM使用
load
store
alloca

想知道加载/存储是否也是必要的,或者LLVM可以不用它

图1↓

图2↓


如果不进行优化,clang将生成LLVM代码,其中每个局部变量有一个
alloca
,每个使用该变量作为r值有一个
read
,每个分配给该变量(包括其初始化)有一个
store

通过优化,clang将尽量减少
read
s和
store
的数量,如果可能的话,通常会完全消除
alloca
(仅使用寄存器)

确保变量存储在内存中的一种方法(即使进行了优化)是获取其地址(因为寄存器没有地址)

想知道加载/存储是否也是必要的,或者LLVM可以不用它

无论何时写入内存位置,都需要
存储
/
加载
。所以问题变成了你是否可以不用内存,把所有的东西都存储在寄存器里。因为LLVM(不像真正的机器)支持无限数量的寄存器,这是一个有效的问题


然而,正如我提到的,寄存器没有地址。因此,任何获取变量地址的代码都需要使用内存。任何对地址执行算术运算的代码,例如对数组进行索引的代码也是如此。

alloca
在函数的本地帧中分配内存。有必要创建一个地址为的变量,如本例所示:

void foo(int* ptr) {
    *ptr = 4;
}

int main() {
    int value = 0;
    foo(&value);
    printf("%i\n", value); // 4
}
如果它没有内联
foo
,那么LLVM将需要
main
中的
alloca
指令来创建支持
变量的内存
foo
需要使用
store
将4放在
ptr
指向的地址,然后
main
需要使用
load
foo
修改后加载
value
的内容

C族语言的编译器通常倾向于首先对函数框架中的每个变量使用
alloca
,然后让LLVM将
alloca
优化为SSA值。在许多情况下,编译器能够将
alloca
ted变量提升为SSA值,如
ssa2
函数所示。SSA表格能够表示满足以下两个条件的变量:

  • 他们的地址没有人知道
  • 它们的大小是固定的
“获取变量的地址”是Javascript/Ruby中不存在的操作,因此您可能需要在C上了解它的含义。它在C和C++中非常普遍。 “固定大小”意味着编译器提前知道特定数据结构需要多少内存。例如,它总是知道简单整数的大小,但数组的大小通常是可变的。可以使用
alloca
malloc
分配运行时未知大小的数组,然后您需要使用
load
store
访问它们的内容

最后,请注意,您的第二个示例被破坏了:它从未初始化的值读取,如果您在更高的优化级别编译它,您将得到
reti32 undef