2013-01-21 61 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指令。 最後,通過檢查依賴關係將兩個結果鏈接在一起。