LLVM 何时使用加载、存储和分配

Lan*_*ard 5 c llvm

我正在查看 LLVM 以了解他们如何使用loadstorealloca。在下面的第一张幻灯片中,没有使用它们。在第二个中,有使用alloca.

\n\n

我对 C 不熟悉,所以必须让自己加快速度才能运行一个示例并自己解决这个问题,但想问是否有人已经知道了。不确定要编写哪种示例 C 代码来确定使用loadstore和 的输出alloca在 LLVM 中

\n\n

问题是,当 LLVM 使用loadstorealloca时。

\n\n

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

\n\n

图1 \xe2\x86\x93

\n\n

在此输入图像描述

\n\n

图2 \xe2\x86\x93

\n\n

在此输入图像描述

\n

sep*_*p2k 6

alloca如果不进行优化,clang 将生成 LLVM 代码,其中每个局部变量都有一个,read每次将该变量用作右值都有一个,store每个对该变量的赋值(包括其初始化)都有一个。

read通过优化,clang 将尝试最小化s的数量,并且如果可能的话store通常会alloca完全消除(仅使用寄存器)。

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

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

每当你写入内存位置时,你都需要store/ 。load所以问题就变成了是否可以不用内存,将所有内容存储在寄存器中。由于 LLVM(与真实机器不同)支持无限数量的寄存器,所以这是一个有效的问题。

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