如何从LLVM的MemoryDe​​pendenceAnalysis传递中获得更好的结果?

bdd*_*ken 5 code-analysis static-analysis llvm llvm-ir

我正在尝试在我正在使用的自定义LLVM传递中使用LLVM内置MemoryDe​​pendenceAnalysis(MDA)的结果.给定一些从内存中读取的指令(load例如,a),我希望MDA告诉我所有先前的指令,这些指令可能有定义或Clobbered它.如果我对MDA文档的理解正确地为我服务,MDA应该能够给我这个信息.但是,我很难从中获得所需的精度.这是我一直在玩的简单测试程序的相关片段:

%1 = alloca i32, align 4
%result = alloca i32, align 4
%x = alloca i32, align 4
%xp = alloca i32*, align 8
store i32 0, i32* %1
store i32 5, i32* %result, align 4, !dbg !14
store i32 7, i32* %x, align 4, !dbg !16
store i32* %x, i32** %xp, align 8, !dbg !19
%2 = load i32* %x, align 4, !dbg !20
%3 = icmp eq i32 %2, 4, !dbg !20
br i1 %3, label %4, label %7, !dbg !22, !dataware.bbuid !23 

; <label>:4                                       ; preds = %0 
%5 = load i32** %xp, align 8, !dbg !24
%6 = load i32* %5, align 4, !dbg !26
store i32 %6, i32* %result, align 4, !dbg !27
br label %8, !dbg !28, !dataware.bbuid !29

; <label>:7                                       ; preds = %0
store i32 42, i32* %result, align 4, !dbg !30
br label %8, !dataware.bbuid !32
Run Code Online (Sandbox Code Playgroud)

用于运行分析的命令:

opt-3.6 -enable-tbaa -tbaa -basicaa -libcall-aa -scev-aa -globalsmodref-aa -domtree -memdep -print-memdeps -gvn -analyze test.bc
Run Code Online (Sandbox Code Playgroud)

对于某些说明,我得到了预期的结果.例如,它告诉我%5 = load i32** %xp依赖于store i32* %x, i32** %xp.但是,它并不确定%6 = load i32* %5是依赖于什么store i32 7, i32* %x.这是输出的片段:

  Def in block %0 from:   store i32* %x, i32** %xp, align 8, !dbg !19
%5 = load i32** %xp, align 8, !dbg !24

  Unknown in block %4
%6 = load i32* %5, align 4, !dbg !26
Run Code Online (Sandbox Code Playgroud)

后一种情况(它显然不知道如何推理)似乎应该很容易检测,即使是次优的别名分析.我该如何调查为什么MDA的结果是次优的?您是否有建议获得更精确的结果?我可以添加一些额外的分析过程以使MDA更好地工作吗?我正在使用opt 3.6.0 - 自从此版本以来,MDA可能已得到改进?

谢谢.

小智 0

我得到的结果与你得到的结果相同。您可以使用更简单的指针分析结果来推断 %5 和 %x 可能别名,进而推断到 %x 的存储可能是从 %5 加载的。

选择-basicaa -aa-eval -print-all-alias-modref-info test.bc -禁用输出

可能别名:i32* %5、i32* %x