我将所有指令数量最小的基本块(通常为3-5)分开:

llvm::SplitBlock(BasicBlock, &*BasicBlockiter, Pass);

并尝试从红外获取对象文件

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

IR:

  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个说明,一切都可以。如何预测/检查并避免此错误?

有帮助吗?

解决方案

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

在您的第二个版本中(此处未提及,请使用stackoverflow代替私人电子邮件...)在定义之前使用%调用(在商店Inst中)(%呼叫= ...),因此显然您的定义并非每个定义之前使用...但是正如我所说,商店不应该在调用后,因为Invoke是终结者。

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

%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

ETC...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top