Я разделяя все основные блоки с минимальным количеством команд (обычно 3-5):LLVM: Инструкция не доминирует все использует
llvm::SplitBlock(BasicBlock, &*BasicBlockiter, Pass);
и пытаюсь получить объектный файл из ИК
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
ИК:
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 инструкций, все в порядке. Как я могу предсказать/проверить и избежать этих ошибок?
Если ваш пропуск просто расщепляет basicblocks, и принимает в качестве входных правильный IR-файл, то нет причин для ошибок доминирования в полученном IR. Есть некоторая причина, которая может вызвать такую ошибку: * вы переехали или создали новые инструкции * вы добавили переходы между базовыми блоками, которые не существовали до –
Это поможет, если вы предоставили более подробную информацию. Минимальный LLVM IR-фрагмент кода * перед * расщеплением, а затем * после * расщепления. В общем, что @JulienH. сказал смысл. –
Прошу прощения, у меня есть другие проходы, и один из них добавляет/изменяет инструкции через llvm :: InlineAsm и llvm :: ReplaceInstWithInst – Denis