LLVM: Инструкция не доминирует во всех целях использования

StackOverflow https://stackoverflow.com/questions/19832757

  •  24-07-2022
  •  | 
  •  

Вопрос

Я разделяю все основные блоки с минимальным количеством инструкций (обычно 3-5):

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

и попытка получить объектный файл из IR

llc -filetype=obj 2.ll

Я получил следующие ошибки:

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

а также

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

а также

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

Я думаю, что после разделения инструкции расположены в разных основных блоках. Если я разделил блок на 10-15 инструкций, все в порядке. Как я могу предсказать/проверить и избежать этих ошибок?

Это было полезно?

Решение

В вашей первой версии у вас была инструкция после инструкции Terminator, которая была неверной, поскольку эта инструкция никогда не выполняется.

Во второй версии (не упомянутой здесь, пожалуйста, используйте Stackoverflow вместо личных электронных писем ...), используют %call (в Store Inst) перед его определением ( %call = ...), так что ваше определение не предшествует каждому Используйте ... но, как я уже сказал, магазин не должен быть после вызова, потому что Avoke является терминатором.

Решение состоит в том, чтобы поместить ваш магазин в следующем базовом блоке (вы можете создать новый):

%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

так далее...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top