LLVM:指令并不是支配所有用途

LLVM:指令并不是支配所有用途,llvm,llvm-ir,Llvm,Llvm Ir,我用最少的指令数(通常为3-5条)拆分所有基本块: 并尝试从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 及 及 IR: 我认为拆分后,指令

我用最少的指令数(通常为3-5条)拆分所有基本块:

并尝试从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

IR:

我认为拆分后,指令位于不同的基本块中。 如果我将块分割为10-15条指令,则一切正常。
如何预测/检查并避免此错误?

在您的第一个版本中,在终止符指令之后有一条指令,这是不正确的,因为此指令从未执行过

在您的第二个版本(此处未提及,请使用stackoverflow而不是私人电子邮件…)中,您在定义%call(%call=…)之前使用了%call(在store inst中),因此显然您的定义并不在每次使用之前。。。 但是正如我所说的,存储不应该在调用之后,因为调用是一个terminatorinst

解决方案是将您的店铺放入下一个基本区块(您可以创建一个新区块):


等等。

如果您的传球只是分割基本锁定,并将正确的IR文件作为输入,则没有理由在结果IR中出现控制错误。有一些原因可能会导致这种错误:*您移动或创建了新的指令*您添加了以前不存在的基本块之间的转换。如果您提供更多详细信息,这将有所帮助。拆分前和拆分后的最小LLVM IR代码片段。一般来说,朱利安。说得有道理。对不起,我还有其他过程,其中一个过程通过llvm::InlineAsm和llvm::ReplaceInstWithInst添加/修改指令llvm中包含的哪些检查可以避免此类错误?您的帖子仍然遗漏了详细信息,如果我能看到完整的IR,或者至少是它的更大子集,这会有所帮助。。。无论如何,每次删除一条指令时,都应该检查该指令是否在以后没有使用(在错误消息中,您看到LLVM中存在一些use_empty()函数)修复了,得到了下一个错误:展开目标没有着陆板指令!调用void@_ZNSt13basic_fstreamIcSt11char_traitsiec1ev(%“class.std::basic_fstream”*%keyStream)LandingPadInst不是块中的第一条非PHI指令。上一个错误已修复。下一个错误:包含LandingPadInst的块必须仅通过调用的展开边缘跳转到。这是否意味着我不能同时使用br和landingpad inst?这意味着包含LandingPadInst的BasicBlock不能作为BranchInst的目标。分支到这样一个基本块的唯一方法是释放调用。请检查此文件(原始文件),并向我解释如何修复错误?嗯,问题似乎来自您的大交换线路595,在这种情况下,会分支到%lpad和%lpad1。这些分支不正确,因为%lpad和%lpad1只能从调用指令访问。你必须在这里转移到其他地方。。。
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
%invoke.cont
  %call = invoke i8* @_ZNKSs5c_strEv(%"class.std::basic_string"* @loadedFile)
          to label %invoke.cont2_before unwind label %lpad1

invoke.cont2_before:                                     ; preds = %invoke.cont
  store i8* %call, i8** %reduced_var
  br label %invoke.cont2

invoke.cont2:                                     ; preds = %main_block, %invoke.cont2_before
  %call4 = invoke i32 @_ZStorSt13_Ios_OpenmodeS_(i32 8, i32 16)
          to label %invoke.cont3_before unwind label %lpad1