Для базового блока я хочу изменить условный переход на безусловный переход. Поэтому, если в базовом блоке было два преемника, я хочу удалить ребро одному из преемников. Я хочу, чтобы основной блок сразу перешел к одному из преемников. Как я могу это сделать?
Чтобы проиллюстрировать свою точку зрения, я хочу изменить
A
/ \
/ \
B C
в
A
\
\
C
Я думаю, что самый простой способ будет просто создать новую безусловную инструкцию перехода, а затем заменить старую. Итак, что-то вроде:
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
BranchInst* Old = ...
BranchInst* New = BranchInst::Create(Old->getSuccessor(X));
ReplaceInstWithInst(Old, New);
куда X
0 или 1, в зависимости от того, хотите ли вы иметь «истинную» ветвь или «ложную» ветвь.
Других решений пока нет …