【问题标题】:How do you create an add instruction in an LLVM IR transform pass?如何在 LLVM IR 转换过程中创建添加指令?
【发布时间】:2016-01-19 04:26:09
【问题描述】:

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

但是,当我尝试使用 llvm::Value::replaceAllUsesWith(Value* V) 进行替换时,我收到一个运行时错误,提示我想要替换 CallInstValueCallInst 的类型不同(有道理)。

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

【问题讨论】:

    标签: llvm


    【解决方案1】:

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

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

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

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

    如果它返回其他内容,您可以使用各种强制转换之一,例如bitcast 获取匹配类型的指令。

    【讨论】:

    • 谢谢!我认为我看到的错误是由于不能用 ConstantInt 替换指令(我现在知道这不是真的),但实际上是因为我的 CallInst 返回了 64 位整数,但我试图替换它们带有一个 32 位的常量整数。顺便说一句,我将如何创建添加指令?我在 Binary Operator 文档中看到 DEFINE_HELPERS (Add, NSW) DEFINE_HELPERS(Add,但我该如何使用它?
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多