在LLVM IR中,我希望复制一组指令,并通过LLVM pass将这些指令粘贴到IR中的另一个位置。如何做到这一点?

在LLVM IR中,我希望复制一组指令,并通过LLVM pass将这些指令粘贴到IR中的另一个位置。如何做到这一点?,llvm,llvm-ir,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 假设你使用C++ API,你只需在它们之间分别地执行每个指

我想从一个部分复制这些说明集,然后粘贴到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

假设你使用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);
}

根据我的经验,提供的解决方案失败了,因为在vmap中填充所有克隆指令之前调用了RemapInstruction。以下是我更新的解决方案:

    std::vector<llvm::Instruction*> new_instructions;
    if (toCopy.size() > 0) {
        llvm::Instruction * insertPt = toCopy[0]->getParent()->getParent()->getEntryBlock().getFirstNonPHIOrDbg();
        for (auto *inst: toCopy) {
            auto *new_inst = inst->clone();
            new_inst->insertBefore(insertPt);
            new_instructions.push_back(new_inst);
            vmap[inst] = new_inst;
            insertPt = new_inst->getNextNode();
        }
    }

    for (auto * i : new_instructions) {
        llvm::RemapInstruction(i, vmap, RF_NoModuleLevelChanges | RF_IgnoreMissingLocals);
    }
std::vector new_指令;
如果(toCopy.size()>0){
llvm::指令*insertPt=toCopy[0]->getParent()->getParent()->getEntryBlock().getFirstNonPHIOrDbg();
用于(自动*inst:toCopy){
自动*new_inst=inst->clone();
新建仪器->插入前(插入前);
新指令。推回(新指令);
vmap[inst]=新仪器;
insertPt=new_inst->getNextNode();
}
}
用于(自动*i:新的_指令){
llvm::RemapInstruction(i、vmap、RF_NoModuleLevelChanges | RF_IgnoreMissingLocals);
}