Стирание первой инструкции в базовом блоке из LLVM IR? - PullRequest
6 голосов
/ 14 марта 2012

У меня есть следующий файл LLVM IR

  %1 = load i32* %i, align 4
  %2 = load i32* %j, align 4
  %3 = icmp sgt i32 %1, %2
  br i1 %3, label %4, label %6

; <label>:4                                       ; preds = %0
  %5 = load i32* %i, align 4
  store i32 %5, i32* %k, align 4
  br label %6

; <label>:6                                       ; preds = %5, %0
  ret i32 0

В нем я сначала загружаю переменную «i» в% 1 и переменную «j» в% 2, затем сравниваю условие «больше чем» (i> j). Исходя из этого, существует ветвь либо для метки 4, либо для метки 6. Моя проблема в том, что есть две инструкции загрузки для переменной «i», одна в первом базовом блоке, а другая во 2-м базовом блоке. Здесь я хочу удалить 2-ю инструкцию по загрузке. Для этого я делаю это так, как когда я достигаю 2-й инструкции загрузки для переменной «i», я заменяю все использования 2-й инструкции первой инструкцией, а затем стираю текущую инструкцию, то есть 2-ю. Здесь я не могу установить указатель итератора инструкции. Я не хочу устанавливать следующую инструкцию (сохранить i32% 5, i32 *% k, выровнять 4). Есть ли другой способ? Если вы знаете, пожалуйста, дайте мне знать.

1 Ответ

11 голосов
/ 14 марта 2012

Если я вас правильно понимаю, все, что вам нужно, это просто стереть инструкцию и продолжать перебирать код. Если это правильно, посмотрите на этот пример с прохода DeadInstElimintation (который находится в lib/Transforms/Scalar/DCE.cpp):

virtual bool runOnBasicBlock(BasicBlock &BB) {
  bool Changed = false;
  for (BasicBlock::iterator DI = BB.begin(); DI != BB.end(); ) {
    Instruction *Inst = DI++;
    if (isInstructionTriviallyDead(Inst)) {
      Inst->eraseFromParent();
      Changed = true;
      ++DIEEliminated;
    }
  }
  return Changed;
}

Интересно отметить, как увеличивается итератор. DI++ делается не в последнем предложении for, а отдельно, с текущим DI, присвоенным Inst. Это гарантирует, что даже если вы удалите Inst, DI уже будет указывать на следующую инструкцию, поэтому цикл продолжит выполнение следующих инструкций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...