2013-01-21 79 views
4

我想确定从我的通过某些加载指令相应的Alloca指令(可以在其他以前的块)。链可以是这样的:TargetLoad(var) -> other stores/loads that use var (or dependencies on var) -> alloca(var).,链接在几个基本块上。你知道我该怎么做?llvm alloca依赖关系

我试图使用DependenceAnalysis和MemoryDe​​pendenceAnalysis中的方法,但结果不正确。例如,MemoryDependenceAnalysis::getDependency应该选择“Def”选项,但只适用于商店,不适用于装载。当我试图使用MemoryDependenceAnalysis::getNonLocalPointerDependencyMemoryDependenceAnalysis::getPointerDependencyFrom时,我也有段错误。当我尝试使用MemDepResult :: getDef()检查结果时,加载指令的结果是相同的指令!所以它取决于它本身,因为它使用了一个先前在代码中定义的变量,这很奇怪。

使交叉点识别target_load_instructions和所有分配的变量所使用的所有变量之间的公共部分的替代方法不是一个选项。因为有可能是这样的:alloca(a) ... c=a*b+4 .... load(c)

DependenceAnalysis :: depends()对我的传球似乎也不好。下一行代码仅供参考:if(DA.depends(allocaInstrArray[i],loadInstrArray[j],true))始终为false。在几种情况下应该是这样。我认为我没有正确使用它。

但是,我做了可能depends()对Alloca不起作用的假设。所以我检查了保存在数组中的所有Load指令之间的依赖关系。一些结果不是基于加载的变量,因为他们应该这样做。例如:LOAD %3 = load i32* %c, align 4 IS DEPENDENT ON %1 = load i32* %j, align 4。正如你所看到的,一个是加载c,一个是加载j。在我的Test.cpp目标代码中,j和c之间没有依赖关系。也许依赖不是基于使用的变量/内存位置?

谢谢你的任何建议!

回答

1

首先,使用ICMP指令的getOperand(0)getOperand(1)。如果有isa<LoadInst>有效,则将它们投射到LoadInstgetPointerOperand()将得到Value *,它是被搜索的实际变量。 其次,在加载指令和Alloca指令之间执行相同的程序。在Load上应用getOperand(0)给出相应的Alloca指令。 最后,通过检查依赖关系将两个结果链接在一起。