gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:43:10 25 4
gpt4 key购买 nike

我正在尝试在我正在处理的自定义 LLVM 传递中使用 LLVM 内置 MemoryDe​​pendenceAnalysis (MDA) 的结果。给定一些从内存中读取的指令(例如 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

我用来运行分析的命令:
opt-3.6 -enable-tbaa -tbaa -basicaa -libcall-aa -scev-aa -globalsmodref-aa -domtree -memdep -print-memdeps -gvn -analyze test.bc

对于一些说明,我得到了预期的结果。例如,它告诉我 %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

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

谢谢。

最佳答案

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

opt -basicaa -aa-eval -print-all-alias-modref-info test.bc -disable-output

MayAlias: i32* %5, i32* %x

关于llvm - 如何从 LLVM 的 MemoryDe​​pendenceAnalysis 传递中获得更好的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31039583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com