在 LLVM IR 中,我想复制一组指令并通过 LLVM pass 将这些指令粘贴到 IR 中的另一个位置。这个怎么做?

use*_*624 6 llvm llvm-ir

我想从一个部分复制这些指令集并粘贴到 IR 中的另一部分

  %0 = load i32, i32* @x, align 4
  %1 = load i32, i32* @y, align 4
  %add = add nsw i32 %0, %1
  %2 = load i32, i32* @n, align 4
  %cmp = icmp slt i32 %add, %2
  %conv = zext i1 %cmp to i32
Run Code Online (Sandbox Code Playgroud)

eus*_*h77 1

假设您使用的是 C++ API,您只需单独克隆每条指令,同时修复它们之间的引用。像下面这样:

llvm::ValueToValueMapTy vmap;

for (auto *inst: instructions_to_clone) {
  auto *new_inst = inst->clone();
  new_inst->insertBefore(insertion_pos);
  vmap[inst] = new_inst;
  llvm::RemapInstruction(new_inst, vmap,
                         RF_NoModuleLevelChanges | RF_IgnoreMissingLocals);
}
Run Code Online (Sandbox Code Playgroud)