Frage

Ich spreche alle grundlegenden Blöcke mit minimaler Anzahl von Anweisungen (normalerweise 3-5):

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

und versuchen, Objektdatei von IR zu erhalten

llc -filetype=obj 2.ll

Ich habe die folgenden Fehler bekommen:

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

und

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

und

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

Ich denke, dass sich die Anweisungen nach der Spaltung in verschiedenen Grundblöcken befinden. Wenn ich den Block in 10-15 Anweisungen aufteilt, ist alles in Ordnung. Wie kann ich diese Fehler vorhersagen/überprüfen und vermeiden?

War es hilfreich?

Lösung

In Ihrer ersten Version hatten Sie nach einer Terminator -Anweisung Anweisung, die nicht falsch war, da diese Anweisung nie ausgeführt wurde.

In Ihrer zweiten Version (hier nicht erwähnt, verwenden Sie bitte Stackoverflow anstelle von privaten E -Mails ...) verwenden Sie %Call (im Store Inst), bevor Sie ihn definieren ( %Call = ...). Daher ist Ihre Definition eindeutig nicht jedem Voraus Verwenden Sie ... aber wie gesagt, der Laden sollte nicht hinter dem Aufruf sein, da aufgerufen wird ein Terminatorinst.

Die Lösung besteht darin, Ihr Geschäft in den nächsten Basisblock zu setzen (Sie können eine neue erstellen):

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top