LLVM中的指针分析

pla*_*nor 6 c pointers llvm

我正在尝试使用LLVM的指针分析,我找到了Andersen指针分析的实现.但是,我是LLVM的新手,我遇到了一些问题.

例如,对于这个简单的C程序(test.c)

int a;
int main()
{  
    int *p, *q;
    a = 20;
    p = &a;
    q = p;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译的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 }
Run Code Online (Sandbox Code Playgroud)

我在程序上运行别名分析

$ opt -load ../Release+Asserts/lib/libAnders.so -anders-aa -aa-eval -print-all-alias-modref-info -disable-output < test.bc
Run Code Online (Sandbox Code Playgroud)

结果是

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
Run Code Online (Sandbox Code Playgroud)

这使我感到困惑,因为(p,q)和{a}是明显的别名.我运行-basicaa并获得类似的结果.

所以我想知道LLVM如何处理IR级别的指针变量?结果是否提供了足够的信息,以便其他分析或优化发现它有用?其他通行证如何使用这些信息?谢谢.

cod*_*ker 6

如果您读入LLVM 文档,则表示结果为No Alias

另一个是当两个指针只用于读取内存时.

所以我认为这可能是因为你没有使用指针写入内存.您应该尝试修改代码,以便指针写入内存.