【问题标题】:Pointer analysis in LLVMLLVM 中的指针分析
【发布时间】: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 分析不在源代码级别,但是,我想知道我是否可以获得接近源代码级别的结果。

标签: c pointers llvm


【解决方案1】:

如果你在 LLVM documentation 中阅读,它会说结果是 No Alias when

另一个是两个指针只用于读取 记忆。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多