LLVM: инструкция не доминирует над всеми видами использования - нет потока управления - PullRequest
0 голосов
/ 03 мая 2018

Я реализовал функцию прохода, которая перебирает базовые инструкции блока и отслеживает все инструкции, имеющие тип IntegerTy.

Вот фрагмент прохода, который делает это:

if (!I->isTerminator()){
  Type::TypeID datatype = I->getType()->getTypeID();
  if (datatype == llvm::Type::IntegerTyID) {
    IRBuilder<> IRB(I);
    Value* v_value = IRB.CreateZExt(I, IRB.getInt64Ty());
    Value *args[] = {v_value};
    IRB.CreateCall(NNT_log_int, args);
  }
}

Однако команда IRB.CreateZExt (I, IRB.getInt64Ty ()); , похоже, создает инструкцию не для всех применений! проблема.

Я понимаю природу проблемы ( здесь и здесь есть похожие проблемы).

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

Сообщение об ошибке:

    Instruction does not dominate all uses!
    %2 = load i32, i32* %y, align 4
    %1 = zext i32 %2 to i64
    Instruction does not dominate all uses!
    %4 = load i32, i32* %y, align 4
    %3 = zext i32 %4 to i64

Примечание тот факт, что вставленные zext инструкции называют константу с номером счетчика меньше , чем предыдущая инструкция - я думаю, что это проблема, но я понятия не имею, почему мой проход делает это !!!

Вот ИК моей игрушечной программы до применения пропуска:

; Function Attrs: noinline nounwind optnone uwtable
define i32 @_Z3fooi(i32 %x) #4 {
entry:
  %x.addr = alloca i32, align 4
  %y = alloca i32, align 4
  %z = alloca i32, align 4
  store i32 %x, i32* %x.addr, align 4
  store i32 0, i32* %y, align 4
  %0 = load i32, i32* %x.addr, align 4
  %add = add nsw i32 %0, 3
  store i32 %add, i32* %y, align 4
  %1 = load i32, i32* %y, align 4
  store i32 %1, i32* %x.addr, align 4
  %2 = load i32, i32* %y, align 4
  ret i32 %2
}

; Function Attrs: noinline nounwind optnone uwtable
define i32 @_Z3bari(i32 %panos) #4 {
entry:
  %panos.addr = alloca i32, align 4
  %y = alloca i32, align 4
  store i32 %panos, i32* %panos.addr, align 4
  %0 = load i32, i32* %panos.addr, align 4
  %add = add nsw i32 %0, 2
  store i32 %add, i32* %y, align 4
  %1 = load i32, i32* %y, align 4
  ret i32 %1
}

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

Любые идеи будут высоко оценены!

1 Ответ

0 голосов
/ 05 мая 2018

Ваша инструкция zext использует I, но вы вставляете ее до I. Когда вы создаете IRBuilder, вы должны передать инструкцию после I в качестве точки вставки. Например, как это:

 IRBuilder<> IRB(I->getNextNode());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...