创建新的存储指令LLVM

时间:2016-01-13 09:37:47

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

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

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

对一些例子有任何帮助吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

几点说明:

  1. 您应该使用IRBuilder创建IR。它更容易,并且在Kaleidoscope教程和clang本身中都有很多例子可供使用。
  2. 我不确定你为什么要创建一个额外的分配。通常,除非您有一个实际的局部变量存储到一个值就足以保存结果。你收藏的是什么?为什么?
  3. 如果你确实需要一个局部变量的额外alloca,那么你应该在函数的入口块中创建它,否则你将在函数的中间创建一个动态分配。