我正在尝试将foo(%10)替换为foo(%5)。我使用以下代码来做到这一点

i.replaceAllUsesWith(dyn_cast<Value>(newfunc_instrct));
i.eraseFromParent();

该过程对于某些代码可以正常工作,但是在使用更复杂的程序进行编译时,遇到了以下错误。我不太明白这个意思。非常感谢您的帮助!谢谢。
Instruction does not dominate all uses!
%81 = bitcast i32* %80 to i8*
%137 = call i32 @foo(i8* %81)
LLVM ERROR: Broken function found, compilation aborted!

最佳答案

“指令并不能支配所有使用”,这意味着可以以某种方式需要指令的结果,但尚未执行该指令。

我讨厌手动输入IR,因此这是一个C示例:

int a;
if(random())
    a = 42;
printf("%d\n", a);

printf需要a,可能尚未初始化。

在您的情况下,我想在%5%5之间使用%10

支配分析是LLVM发现问题的过程。它在LLVM中用于许多用途。错误消息的措词不理想。

关于c++ - 删除并替换新的IR代码时,说明并不能支配所有用途,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57384168/

10-11 22:36
查看更多