Как я могу вставить / удалить ребро в LLVM?

Могу ли я вставить новое ребро, изменив его назначение, и удалить другое ребро по его источнику и назначению. Другими словами, могу ли я заменить назначение основного блока ребра другим, чтобы внести некоторые изменения в CFG?

Я старался getEdge() функция в ProfileInfo, но это не сработало:

// to replace the basic block
Bb->getTerminator()->replaceUsesOfWith((*SI), (*rit));

// trying to set the new basic block as a new destination
xx = ProfileInfo::getEdge(Bb,(*rit));

1 ответ

Базовый блок имеет одну инструкцию-терминатор. Однако этот терминатор может быть одной из нескольких инструкций, которые сильно отличаются. Некоторые могут иметь несколько ребер. Так что это не так просто, как кажется.

Что вы можете сделать, это посмотреть на терминатор блока и изменить инструкцию для перехода к другому месту назначения. Это зависит от инструкции и (конечно) от ваших конкретных потребностей.

Другие вопросы по тегам