Я реализовал функцию прохода, которая перебирает базовые инструкции блока и отслеживает все инструкции, имеющие тип 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
}
Кроме того, обратите внимание, что проблемные инструкции находятся перед терминатором - опять же я думаю, что это связано.
Любые идеи будут высоко оценены!