什么时候在LLVM中使用load、store和alloca
我正在查看LLVM,以了解它们如何使用什么时候在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↓ 如果不进行优化,
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表格能够表示满足以下两个条件的变量:
- 他们的地址没有人知道
- 它们的大小是固定的
alloca
或malloc
分配运行时未知大小的数组,然后您需要使用load
和store
访问它们的内容
最后,请注意,您的第二个示例被破坏了:它从未初始化的值读取,如果您在更高的优化级别编译它,您将得到reti32 undef