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

问题描述:

我想将这些指令集的一个部分在另一部分在IR在LLVM IR中,我想复制一组指令,并通过LLVM传递将这些指令粘贴到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复制并粘贴到这一点,你只需要clone每条指令分别同时fixing references它们之间。类似以下内容:

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); 
}