2013-04-27 2 views
0

Я пытаюсь понять, как я могу заменить инструкцию LLVM и убедиться, что ссылка, которая была установлена ​​равной исходной команде, может быть сброшена на новую создаваемую команду (для жизнь меня, я действительно трудное время навигации документацию LLVM)LLVM- Замена инструкций, назначенных для ссылки

у меня есть инструкции я, и я знаю, что это то, что я хочу replace- я это делаю

BinaryOperator::Create(Instruction::Add, value, operand, "", i); 
    i->eraseFromParent(); 

чтобы создать мое новое вмешательство и поместите его перед тем, как я, меня заменяю. Затем я удаляю i.

Моя проблема в том, что старая инструкция была установлена ​​в регистр, а позже% 2 повторно используется для хранилища (например, ниже, например).

%2 = mul %0, 2 

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

ответ

1

На промежуточном языке LLVM нет регистров или переменных, а также нет назначений. Смущенный? Я рекомендую прочитать больше о SSA form.

В частности, я рекомендую избегать мышления в именах (% something). Имена полезны только для текстового представления промежуточного языка (.ll-файлов), они не имеют слишком большого числа применений при непосредственном использовании API LLVM.

В любом случае replaceinstwithinst является хорошим способом заменить одну инструкцию на другую. Фактически это заменяет все применения старой инструкции с использованием новой.

+0

Спасибо, это было именно то, что мне нужно - я надеялся, что ReplaceInstWithInst сделал это, но не смог найти окончательного ответа в любом месте – winepretzel

Смежные вопросы