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

时间:2017-05-28 17:42:32

标签: llvm llvm-ir instructions

我正在尝试将一组指令从源Basic块复制到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

来源基本块

continuation:                                     ; preds = %else, %then
  %iftmp = phi i32 [ 5, %then ], [ 9, %else ]
  store i32 %iftmp, i32* %datasize

; 3 lines below to be copied and then this whole basic block needs to be deleted.
  store i8000000 0, i8000000* %res
  %res4 = load i8000000, i8000000* %res
  ret i8000000 %res4
}

相关的代码块

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

我的问题

我一直在使用Instruction::clone()复制说明,然后为此克隆设置名称。

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

有没有办法使用API​​来实现这一目标?

作为一个例子 - 看到标记为&#34;问题&#34;以上,&#34; ret&#34;指令正在返回旧的&#34;%res&#34;值。 如何确保它返回&#34;%res45&#34; &#34;%res46 &#34;在每个目标基本块?

0 个答案:

没有答案