2013-04-28 72 views
0

我試圖用常量替換地址的所有實例。LLVM:用常量替換地址的所有實例

我得到&以下測試商店的地址(i是指令)

//already know it's a store instruction at this point 
llvm::Value *addy = i->getOperand(0); 
if(llvm::ConstantInt* c = dyn_cast<llvm:::ConstantInt>(addy)){ 
    //replace all uses of the address with the constant 
    //operand(1) will be the address the const would be stored at 
    i->getOperand(1)->replaceAllUsesWith(c); 
} 

我認爲這會工作,但我得到的錯誤是

"Assertion: New->getType()== getType() && replaceAllUses of value with new value of different type!" failed 

,我不知道爲什麼......我replaceAllUses的理解是,它會替換地址的使用(I-> getOperand(1)用恆定的?

回答

2

錯誤MESSA ge非常簡單:新值的類型與您要替換的舊值的類型不同。

LLVM IR是強類型,並且可以在language reference看到,每一個指令有它預計爲每個操作數的特定類型。例如,store要求地址的類型將始終是指向所存儲值的類型的指針。因此,無論何時替換值的用法,您都必須首先確保它們具有相同的類型 - 如您所見,replaceAllUsesWith實際上有斷言來驗證它,並且您失敗了。原因很簡單:存儲指令的操作數1始終是某種指針類型,並且ConstantInt總是表示某種整數類型的東西,所以它們肯定無法匹配。

你究竟想達到什麼目的?也許你正在考慮用常量的用法替換該商店地址的每個load?在這種情況下,你必須找到使用該地址的所有load,並且對於它們中的每一個(對於每個負載,我的意思是,不是地址)使用該常量執行replaceAllUsesWith。順便提一下,有標準LLVM通行證可以爲你做這些事情 - 請查看the pass list。我猜mem2reg後面是一些不斷的傳播通過會照顧到這一點。

相關問題