GlobalMerge
这算是个中型 Pass,代码量有 770 多行。因为大模型理解得比我深,所以这个例子主要使用模型的输入作为参考。
其作用是:将具有内部链接(internal linkage)的全局变量合并为一个大的全局结构,从而==优化内存访问并降低寄存器压力,尤其是在处理多个全局变量的场景下。==
✅ 它具体做了什么?
查找所有具有内部链接的全局变量(如 static int foo[N]; 之类的)。
将这些变量合并为一个结构体(struct),例如:
static struct {
int foo[N];
int bar[N];
int baz[N];
} merged;
替换原来的变量访问,使所有原本独立变量的访问都通过结构体的偏移量访问。
📈 为什么这样做是有益的?
在某些体系结构(如 ARM)上,每个全局变量的地址都需要通过寄存器持有,因此如果你有多个全局变量,就需要多个寄存器。
将这些变量合并到一个结构中后,只需要一个寄存器持有结构体的基地址,其他变量都可以通过偏移访问。
可以显著减少寄存器压力,提高代码 ...