Pergunta

Estou dividindo todos os blocos básicos com número mínimo de instruções (geralmente 3-5):

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

e tentando obter o arquivo de objeto de IR

llc -filetype=obj 2.ll

Recebi os seguintes erros:

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

Eu acho que, após a divisão, as instruções estão localizadas em diferentes blocos básicos. Se eu dividir o bloco em 10 a 15 instruções, tudo está ok. Como posso prever/verificar e evitar esses erros?

Foi útil?

Solução

Na sua primeira versão, você teve instruções após uma instrução do Terminator, que estava incorreta, pois esta instrução nunca foi executada.

Na sua segunda versão (não mencionada aqui, use o StackOverflow em vez de e -mails privados ...) estão usando %de chamada (no Inst da loja) antes de defini -lo ( %Call = ...), então claramente sua definição não precede cada Use ... mas, como eu disse, a loja não deve estar após a invoque, porque a Invoke é um TerminatorInst.

A solução é colocar sua loja no próximo bloco básico (você pode criar um novo):

%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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top