Domanda

Sto dividendo tutti i blocchi di base con il numero minimo di istruzioni (di solito 3-5):

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

e cercando di ottenere un file oggetto da IR

llc -filetype=obj 2.ll

Ho ricevuto i seguenti errori:

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

e

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

e

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

Penso che dopo la divisione, le istruzioni si trovano in diversi blocchi di base. Se ho diviso il blocco in istruzioni 10-15, tutto va bene. Come posso prevedere/controllare ed evitare questi errori?

È stato utile?

Soluzione

Nella prima versione, hai avuto istruzioni dopo un'istruzione Terminator, che non era corretta poiché questa istruzione non è mai stata eseguita.

Nella tua seconda versione (non menzionata qui, usa StackOverFlow anziché e -mail private ...) stanno usando %call (nel negozio Inst) prima di definirla ( %call = ...), quindi chiaramente la tua definizione non precede tutti Usa ... ma come ho detto, il negozio non dovrebbe essere dopo l'invoke, perché Invochi è un TerminatorInst.

La soluzione è mettere il tuo negozio nel blocco di base successivo (puoi crearne uno nuovo):

%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

eccetera...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top