将指令从LLVM中的1个基本块复制到2个或更多(不同)基本块

将指令从LLVM中的1个基本块复制到2个或更多(不同)基本块,llvm,llvm-ir,instructions,Llvm,Llvm Ir,Instructions,我正在尝试将一组指令从源基本块复制到2个或更多目标基本块。复制后,我希望从源基本块中删除指令,然后删除源基本块 在与API进行了一点斗争之后,我得到了以下结果 目标基本块 then: ; preds = %entry store i8000000 0, i8000000* %res ;after copying **Issue-----> %res45 = load i8000000, i80

我正在尝试将一组指令从源基本块复制到2个或更多目标基本块。复制后,我希望从源基本块中删除指令,然后删除源基本块

在与API进行了一点斗争之后,我得到了以下结果

目标基本块

then:                                             ; preds = %entry
  store i8000000 0, i8000000* %res

;after copying
  **Issue-----> %res45 = load i8000000, i8000000* %res
  ret i8000000 %res4 <----- Issue**
  br label %continuation

else:                                             ; preds = %entry
  store i8000000 0, i8000000* %res

;after copying
  **Issue----->%res46- = load i8000000, i8000000* %res
  ret i8000000 %res4 <----- Issue**
  br label %continuation
相关代码块

//startInst/endInst是开始/完成复制的指令的迭代器

for (auto i = startInst, e = endInst; i != e; ++i) {
  Instruction* temp = i->clone();

  temp->insertBefore(terminatorInst);

  Value* copyInstVal = temp;
  Value* originalInstVal = &(*i);

  copyInstVal->setName(originalInstVal->getName());
}
我的问题

我一直在使用
指令::克隆()
复制指令,然后为该克隆设置名称

我的主要问题是,一旦我将指令复制到新的基本块中,我需要在指令之间保持相同的依赖关系。但是,SSA寄存器名称(指令的LHS)在LLVM函数中不能相同,因此存在此问题。

有没有办法使用API来实现这一点?

作为上面标记为“Issue”的示例,“ret”指令返回旧的“%res”值。
如何确保它在每个目标基本块中返回“%res45”“%res46”?

请显示用于克隆指令的完整代码。我假设您编写了一个机器函数过程来解决此问题。您是否尝试过使用
指令::clone()
的返回值更新返回指令的操作数?@StanislavPankevich-我现在已经添加了相关的代码段。@ConsistentProgrammer-嗨,我不想手动执行(可能以某种方式使用use def或def use info)为了实现它,因为我希望它适用于一般场景。我现在更新了“Myissue”部分以澄清这一点。请显示您用于克隆指令的完整代码。我假设您编写了一个机器函数过程来解决此问题。您是否尝试过使用
指令::clone()
的返回值更新返回指令的操作数?@StanislavPankevich-我现在已经添加了相关的代码段。@ConsistentProgrammer-嗨,我不想手动执行(可能以某种方式使用use def或def use info)为了实现它,我希望它能在一般情况下工作。我现在更新了“我的问题”部分来澄清这一点。
for (auto i = startInst, e = endInst; i != e; ++i) {
  Instruction* temp = i->clone();

  temp->insertBefore(terminatorInst);

  Value* copyInstVal = temp;
  Value* originalInstVal = &(*i);

  copyInstVal->setName(originalInstVal->getName());
}