LLVM:用常量替换地址的所有实例

时间:2013-04-28 21:36:18

标签: 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-&gt; getOperand(1)?

1 个答案:

答案 0 :(得分:2)

错误消息非常简单:新值的类型与要替换的旧值的类型不同。

LLVM IR是强类型的,正如您在language reference中看到的,每个指令都有一个特定的类型,它期望作为每个操作数。例如,store要求地址的类型始终是指向所存储值的类型的指针。

因此,无论何时替换值的使用,您必须首先确保它们都具有相同的类型 - replaceAllUsesWith实际上有一个断言来验证它,如您所见,并且您失败了。理解原因也很简单:存储指令的操作数1总是有一些指针类型,而ConstantInt总是表示某种整数类型的东西,所以它们肯定永远不会匹配。

你到底想要达到什么目的?也许你正在考虑用常量的用法替换该商店地址的每个load?在这种情况下,您必须找到使用该地址的所有load,并且对于每个{(1)负载(我的意思是,不是地址)执行replaceAllUsesWith与常数。顺便说一句,有标准的LLVM通行证可以为你做这些事情 - 请查看the pass list。我猜测mem2reg后跟一些常量传播传递将会解决这个问题。