【发布时间】:2015-03-24 00:04:30
【问题描述】:
我正在尝试对 LLVM 使用指针分析,但我找到了 Andersen's pointer analysis 的实现。但是,我是 LLVM 新手,遇到了一些问题。
例如,对于这个琐碎的 C 程序 (test.c)
int a;
int main()
{
int *p, *q;
a = 20;
p = &a;
q = p;
return 0;
}
编译后的 LLVM IR 是
5 @a = common global i32 0, align 4
6
7 ; Function Attrs: nounwind uwtable
8 define i32 @main() #0 {
9 entry:
10 %retval = alloca i32, align 4
11 %p = alloca i32*, align 8
12 %q = alloca i32*, align 8
13 store i32 0, i32* %retval
14 store i32 20, i32* @a, align 4
15 store i32* @a, i32** %p, align 8
16 %0 = load i32** %p, align 8
17 store i32* %0, i32** %q, align 8
18 ret i32 0
19 }
我在程序上运行别名分析
$ opt -load ../Release+Asserts/lib/libAnders.so -anders-aa -aa-eval -print-all-alias-modref-info -disable-output < test.bc
结果是
Function: main: 5 pointers, 0 call sites
NoAlias: i32* %retval, i32** %p
NoAlias: i32* %retval, i32** %q
NoAlias: i32** %p, i32** %q
NoAlias: i32* %retval, i32* @a
NoAlias: i32* @a, i32** %p
NoAlias: i32* @a, i32** %q
NoAlias: i32* %0, i32* %retval
NoAlias: i32* %0, i32** %p
NoAlias: i32* %0, i32** %q
MustAlias: i32* %0, i32* @a
这让我很困惑,因为 (p, q) 和 {a} 是明显的别名。我运行-basicaa 并得到类似的结果。
所以我想知道 LLVM 如何处理 IR 级别的指针变量?结果是否提供了足够的信息以使其他分析或优化发现它有用?其他通行证如何使用这些信息?谢谢。
【问题讨论】:
-
只是在黑暗中刺伤...您在编译
test.c时是否使用了任何优化级别?我认为编译器至少需要-O1才能确保进行一些分析。在-O0,不需要优化,也不会进行分析。 -
如果我打开-O1,在这种情况下p和q将被淘汰。我知道 LLVM 分析不在源代码级别,但是,我想知道我是否可以获得接近源代码级别的结果。