Question

Je divise tous les blocs de base avec un nombre minimum d'instructions (généralement 3-5):

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

et essayer d'obtenir un fichier d'objet d'IR

llc -filetype=obj 2.ll

J'ai les erreurs suivantes:

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

et

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

et

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

Je pense qu'après la séparation, les instructions sont situées dans différents blocs de base. Si je divise le bloc en 10-15 instructions, tout va bien. Comment puis-je prédire / vérifier et éviter ces erreurs?

Était-ce utile?

La solution

Dans votre première version, vous avez eu des instructions après une instruction Terminator, ce qui était incorrect car cette instruction n'est jamais exécutée.

Dans votre deuxième version (non mentionnée ici, veuillez utiliser Stackoverflow au lieu d'e-mails privés ...) utilisent% Call (dans le magasin Inst) avant de le définir (% Call = ...), donc clairement votre définition ne précède pas chaque Utilisez ... mais comme je l'ai dit, le magasin ne devrait pas être après l'invoque, car Invoke est un terminatoratst.

La solution consiste à mettre votre magasin dans le prochain bloc de base (vous pouvez en créer un nouveau):

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top