一、什么是别名分析
Alias Analysis (又名 Pointer Analysis)是用于确定两个指针是否指向内存中的同一对象,这里有很多不同的别名分析算法,分为几种类型:流敏感vs流非敏感、上下文敏感vs上下文非敏感、域敏感vs域非敏感、基于一致性的vs基于子集的。传统的别名分析用于回答must、may、no的问题,也即两个指针总是指向同一对象,可能指向同一对象以及绝不会指向同一对象。(SSA—静态单一赋值,将同一变量名用多个名表示,被赋值的变量名不会重复,便于寻找变量的产生与使用点)。
二、别名分析有什么用
有这样一个例子:
int foo (int __attribute__((address_space(0)))* a,
int __attribute__((address_space(1)))* b) {
*a = 42;
*b = 20;
return *a;
}
__attribute__ 指示符指定 a 是一个i32*的地址,b 是一个i32 addrspace(1)*的地址,生成ir如下:
define i32 @foo(i32* nocapture %0, i32 addrspace(1)* nocapture %1) local_unnamed_addr #0 {
store i32 42, i32* %0, align 4, !tbaa !10
store i32 20, i32 addrspace(1)* %1, align 4, !tbaa !10
%3 = load i32, i32* %0, align 4, !tbaa !10
ret i32 %3
}
我们先忽略指令后边的!tbaa这个metadata信息,这个之后会讲到。这个是clang在O2的场景下生成的IR。现在需要对于函数foo进行进一步的优化,去掉不必要的load:
define i32 @foo(i32* nocapture %0, i32 addrspace(1)* nocapture %1) local_unnamed_addr #0 {
store i32 42, i32* %0, align 4, !tbaa !10
store i32 20, i32 addrspace(1)* %1, align 4, !tbaa !10
ret i32 42
}
但是这个优化有一个前提,就是a和b不能别名,不然可能会有错误:
int i = 0;
int result = foo(&i, &i);

最低0.47元/天 解锁文章
1431

被折叠的 条评论
为什么被折叠?



