【发布时间】:2013-11-07 09:53:50
【问题描述】:
我用最少的指令数(通常是 3-5)分割所有基本块:
llvm::SplitBlock(BasicBlock, &*BasicBlockiter, Pass);
并尝试从 IR 获取目标文件
llc -filetype=obj 2.ll
我收到以下错误:
Instruction does not dominate all uses!
%1 = alloca i32
%mul = load i32* %1
Instruction does not dominate all uses!
%1 = alloca i32
%99 = load i32* %1
和
While deleting: i32 %
Use still stuck around after Def is destroyed: %var = alloca i32
Assertion failed: use_empty() && "Uses remain when a value is destroyed!"
和
error: expected instruction opcode
invoke.cont2: ; preds = %main_block, %invoke
.cont
红外:
invoke.cont2: ; preds = %main_block, %invoke.cont
%call4 = invoke i32 @_ZStorSt13_Ios_OpenmodeS_(i32 8, i32 16)
to label %invoke.cont3 unwind label %lpad1
store i32 %call4, i32* %var4
我认为拆分后的指令位于不同的基本块中。 如果我将块分成 10-15 条指令,一切都很好。 如何预测/检查并避免此错误?
【问题讨论】:
-
如果您的通行证只是拆分基本块,并将正确的 IR 文件作为输入,那么在生成的 IR 中没有理由出现控制错误。有一些原因可能会导致这种错误:*您移动或创建了新指令*您添加了以前不存在的基本块之间的转换
-
如果您提供更多详细信息会有所帮助。代码before拆分的最小LLVM IR sn-p,然后after拆分。一般来说@JulienH。说的有道理。
-
对不起,我还有其他通行证,其中一个通过 llvm::InlineAsm 和 llvm::ReplaceInstWithInst 添加/修改指令
-
可以添加 LLVM 中包含的哪些检查以避免此类错误?
-
你的帖子仍然遗漏了细节,如果我能看到完整的 IR,或者至少是其中的一个更大的子集,这将有所帮助......无论如何,每次你删除一条指令时,你应该检查一下指令没有以后使用(在您的错误消息中,您看到 LLVM 中存在一些 use_empty() 函数)