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

How do you create an add instruction in an LLVM IR transform pass?

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

但是,当我尝试使用 llvm::Value::replaceAllUsesWith(Value* V) 进行替换时,出现运行时错误,提示我要替换 CallInstValue 不相同输入 CallInst(这是有道理的)。

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

要创建添加指令,您需要创建 BinaryOperator 记录的 here

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

但是,我建议先解决 ConstantInt 的类型问题。假设您的 CallInst returns 是一个整数类型,您可以这样做:

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

如果它 returns 其他你可以使用各种演员之一,例如bitcast 获取匹配类型的说明。