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

如何在LLVM IR转换过程中创建add指令?,llvm,Llvm,我想将IR中的某些CallInst替换为ConstantInt值。在我的转换过程中,我已经能够识别出我想要替换的CallInst,并且我已经创建了我想要替换它们的ConstantInt 但是,当我尝试使用llvm::Value::replaceAllosesWith(Value*V)进行替换时,我得到一个运行时错误,即我要替换CallInst的Value与CallInst的类型不同(这很有意义) 我的另一种解决方案是用add指令替换CallInst,该指令将常量整数相加为零。然而,我似乎不知道如

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

但是,当我尝试使用
llvm::Value::replaceAllosesWith(Value*V)
进行替换时,我得到一个运行时错误,即我要替换
CallInst
Value
CallInst
的类型不同(这很有意义)


我的另一种解决方案是用add指令替换
CallInst
,该指令将常量整数相加为零。然而,我似乎不知道如何在转换过程中创建add指令对象。我知道
IRBuilder
有一个
CreateAdd
方法,但我想创建一条独立的指令,而不是一个新的基本块。

要创建一条add指令,您需要创建一个
二进制操作符

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

但是,我建议先用
ConstantInt
解决类型问题。假设CallInst返回整数类型,则可以执行以下操作:

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

如果它返回其他内容,您可以使用各种类型转换中的一种,例如使用说明来获取匹配类型。

谢谢!我认为我看到的错误是因为不能用常量替换指令(我现在知道这不是真的),但实际上是因为我的CallInst返回64位整数,但我试图用32位常量整数替换它们。顺便提一下,我如何创建add指令?我在二进制运算符文档中看到了
DEFINE_HELPERS(Add,NSW)DEFINE_HELPERS(Add
),但是我如何使用它呢?