如何在LLVM IR转换过程中创建添加指令?

时间:2016-01-19 04:26:10

标签: llvm

我希望将IR中的某些CallInst替换为ConstantInt值。在我的转换过程中,我已经能够识别出我要替换的CallInst这些,并且我创建了我想要替换它们的ConstantInt

但是,当我尝试使用llvm::Value::replaceAllUsesWith(Value* V)进行替换时,我收到一个运行时错误,指出Value我要替换CallInst与{0}的类型不同CallInst(这是有道理的)。

我的替代解决方案是使用添加常量整数为零的添加指令替换CallInst。但是,我似乎无法找到如何在转换传递中创建添加指令对象。我知道IRBuilder有一个CreateAdd方法,但我想创建一个独立的指令,而不是一个新的基本块。

1 个答案:

答案 0 :(得分:0)

要创建添加说明,您需要创建BinaryOperator文档here

BinaryOperator类为您提供了一些CreateX函数以及一个通用的Create,您可以在其中指定要作为第一个参数创建的操作。

但是,我建议先使用ConstantInt修复类型问题。假设您的CallInst返回一个整数类型,您可以这样做:

CallInst* call = ... // your call
call->replaceAllUsesWith(ConstantInt::get(call->getType(), 0));

如果它返回别的东西你可以使用各种演员之一,例如获得匹配类型的bitcast说明。