【问题标题】:Creating a new Store Instruction LLVM创建新的存储指令 LLVM
【发布时间】:2016-01-13 09:37:47
【问题描述】:

我正在使用 LLVM IR 代码。我想创建一个新的store 指令(例如:store i32 %add, i32* %temp1, align 4),我需要在特定指令之后插入它,比如在add 指令之后。我的意图是,加法运算的结果(某个指针)存储在%add 中,我需要在 临时变量 中保留一份相同的副本,例如 %temp1

为此,我首先创建了一个名为 temp1 的变量 (%temp1 = alloca i32, align 4)。现在我想存储加法指令的结果(%add = add nsw i32 %0, %1),即%addtemp1。那么最后的 store 指令 将是这样的:store i32 %add, i32* %temp1, align 4。如何做到这一点?

对一些例子有帮助吗?

【问题讨论】:

    标签: compiler-construction llvm compiler-optimization llvm-clang llvm-ir


    【解决方案1】:

    为了创建%temp1 = alloca i32, align 4 指令,我使用了以下语句:

    AllocaInst* pa = new AllocaInst(llvm::Type::getInt32Ty(getGlobalContext()), 0, 4,"temp1");
    

    用于创建和插入新的store 指令:

    StoreInst *str = new StoreInst(i, pa); // i -> current instruction pointer which represents %add ( source of store instruction ), pa -> destination. i.e., temp1
    BB->getInstList().insert(ib, str); // ib -> instruction address before which you want to insert this store instruction
    

    【讨论】:

    • 您可以将ib 作为第三个参数传递给StorInst 构造函数。所有指令构造函数都将插入点作为最后一个参数:例如StoreInst (Value *Val, Value *Ptr, Instruction *InsertBefore)StoreInst (Value *Val, Value *Ptr, BasicBlock *InsertAtEnd)
    【解决方案2】:

    几点说明:

    1. 您应该使用 IRBuilder 来创建 IR。这要容易得多,而且 Kaleidoscope 教程和 clang 本身都有大量示例可供使用。
    2. 我不确定您为什么要创建额外分配。一般来说,除非您有一个实际的局部变量要存储到 Value 中,否则足以保存结果。您要存储什么以及为什么?
    3. 如果您确实需要为局部变量分配额外的分配,那么您应该在函数的入口块中创建它,否则您将在函数中间创建动态分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 2012-04-01
      相关资源
      最近更新 更多