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