我正在尝试将一组指令从源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;在每个目标基本块?