我正在尝试用常量替换地址的所有实例。
我得到&使用以下(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-&gt; getOperand(1)?
答案 0 :(得分:2)
错误消息非常简单:新值的类型与要替换的旧值的类型不同。
LLVM IR是强类型的,正如您在language reference中看到的,每个指令都有一个特定的类型,它期望作为每个操作数。例如,store
要求地址的类型始终是指向所存储值的类型的指针。
因此,无论何时替换值的使用,您必须首先确保它们都具有相同的类型 - replaceAllUsesWith
实际上有一个断言来验证它,如您所见,并且您失败了。理解原因也很简单:存储指令的操作数1总是有一些指针类型,而ConstantInt
总是表示某种整数类型的东西,所以它们肯定永远不会匹配。
你到底想要达到什么目的?也许你正在考虑用常量的用法替换该商店地址的每个load
?在这种情况下,您必须找到使用该地址的所有load
,并且对于每个{(1)负载(我的意思是,不是地址)执行replaceAllUsesWith
与常数。顺便说一句,有标准的LLVM通行证可以为你做这些事情 - 请查看the pass list。我猜测mem2reg后跟一些常量传播传递将会解决这个问题。