如何从LLVM';记忆依赖分析通过了吗?

如何从LLVM';记忆依赖分析通过了吗?,llvm,code-analysis,static-analysis,llvm-ir,Llvm,Code Analysis,Static Analysis,Llvm Ir,我试图在我正在处理的自定义LLVM过程中使用LLVMs内置MemoryDependenceAnalysis(MDA)的结果。给定一些从内存读取的指令(例如,aload),我想让MDA告诉我之前定义或删除它的所有指令。如果我对MDA文档的理解正确,MDA应该能够给我这些信息。然而,我很难从中获得所需的精度。下面是我一直在玩弄的一个简单测试程序的相关片段: %1 = alloca i32, align 4 %result = alloca i32, align 4 %x = alloca i32,

我试图在我正在处理的自定义LLVM过程中使用LLVMs内置MemoryDependenceAnalysis(MDA)的结果。给定一些从内存读取的指令(例如,a
load
),我想让MDA告诉我之前定义或删除它的所有指令。如果我对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
对于一些说明,我得到了预期的结果。例如,它告诉我,
%5=load i32**%xp
依赖于
存储i32*%x,i32**%xp
。但是,它不能确定
%6=load i32*%5
是否依赖于
存储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
后一种情况(它显然不知道如何推理)似乎应该很容易检测,即使使用次优别名分析也是如此。我如何着手调查为什么MDA的结果是次优的?你对获得更精确的结果有什么建议吗?我是否可以添加一些额外的分析过程以使MDA更好地工作?Im使用opt 3.6.0-自本版本发布以来,MDA是否有所改进


谢谢。

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

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

MayAlias:i32*%5,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