Pregunta

Estoy dividiendo todos los bloques básicos con un número mínimo de instrucciones (generalmente 3-5):

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

e intentando obtener el archivo de objeto de IR

llc -filetype=obj 2.ll

Tengo los siguientes errores:

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

y

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!"

y

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

Creo que después de dividir, las instrucciones se encuentran en diferentes bloques básicos. Si dividí el bloque en 10-15 instrucciones, todo está bien. ¿Cómo puedo predecir/verificar y evitar estos errores?

¿Fue útil?

Solución

En su primera versión, tenía instrucción después de un Terminator Instruction, que era incorrecto ya que esta instrucción nunca se ejecuta.

En su segunda versión (no mencionada aquí, use StackOverflow en lugar de correos electrónicos privados ...) están utilizando %llamadas (en el instit de la tienda) antes de definirlo ( %call = ...), por lo que claramente su definición no precede a cada Use ... pero como dije, la tienda no debería estar después del Invoke, porque Invoke es un TerminatorInst.

La solución es poner su tienda en el siguiente bloque básico (puede crear uno nuevo):

%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...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top