我正在编写一个需要分析内存依赖性的LLVM传递。传递需要找到一个内存读取每个可以定义此内存的指令。例如:
int foo(){
int x = 123;
if(getchar()){
x = 321;
}
return x;
}
在这种情况下,pass在返回时从内存加载x时需要找到x的两个定义。我在传递中使用了以下代码。
MemoryDependenceAnalysis &MDA = getAnalysis<MemoryDependenceAnalysis>();
if (isa<LoadInst>(i)) {
MemDepResult d = MDA.getDependency(&i);
if (d.isNonLocal()) {
SmallVector<NonLocalDepResult, 4> result;
MDA.getNonLocalPointerDependency(&i, result);
for (SmallVectorImpl<NonLocalDepResult>::iterator it=result.begin() ; it < result.end(); it++ ) {
MemDepResult dd = it->getResult();
if (dd.isUnknown())
errs() << "Unknown\n"; //result always unknown
}
}
}
}
MDA.getDependency()为我提供了一个本地(在同一个基本块中)的依赖关系的正确结果。但是getNonLocalPointerDependency()总是返回空指针。
如何让LLVM找到可以定义加载指令内存的每个商店?