【问题标题】:LLVM: Instruction does not dominate all usesLLVM:指令不支配所有用途
【发布时间】: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() 函数)

标签: llvm llvm-ir


【解决方案1】:

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

在您的第二个版本中(此处未提及,请使用 stackoverflow 而不是私人电子邮件...)在定义它之前使用 %call(在商店 inst 中)(%call = ...),所以很明显您的定义确实如此不是在每次使用之前... 但正如我所说,存储不应该在调用之后,因为调用是一个终止符。

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

%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

等等……

【讨论】:

  • 已修复,出现下一个错误:展开目的地没有着陆板指令!调用 void @_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1Ev(%"class.std::basic_ fstream"* %keyStream) LandingPadInst 不是块中的第一个非 PHI 指令。
  • 上一个错误已修复。下一个:包含 LandingPadInst 的块必须仅在调用的展开边缘跳转到。这是否意味着我不能同时使用 br 和landingpad inst?
  • 这意味着包含 LandingPadInst 的 BasicBlock 不能成为 BranchInst 的目标。分支到这样的 BasicBlock 的唯一方法是展开调用。
  • 能否请您检查此文件pastebin.com/kRWFuXV3(原pastebin.com/WvkmBYiE),并解释我如何解决这些错误?
  • 嗯,问题似乎出在你的大开关线 595 上,其中有分支到 %lpad 和 %lpad1 的情况。这些分支是不正确的,因为 %lpad 和 %lpad1 只能从调用指令中访问。你必须在这里分支到别的东西......
猜你喜欢
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多