LLVM:指令并非支配所有用途-无控制流

LLVM:指令并非支配所有用途-无控制流,llvm,dominate,Llvm,Dominate,我实现了一个函数pass,它迭代基本块指令并跟踪所有具有整数类型的指令 下面是执行此操作的过程的片段: if (!I->isTerminator()){ Type::TypeID datatype = I->getType()->getTypeID(); if (datatype == llvm::Type::IntegerTyID) { IRBuilder<> IRB(I); Value* v_value = IRB.CreateZExt(

我实现了一个函数pass,它迭代基本块指令并跟踪所有具有整数类型的指令

下面是执行此操作的过程的片段:

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);
  }
}
注意插入的zext指令命名一个常数,其计数器编号比上一条指令少——我认为这就是问题所在,但我不知道我的pass为什么会这样做

以下是申请通行证前我的玩具程序的IR:

; 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
}
另外,请注意,有问题的指令在终止符之前-我再次认为这是相关的


任何想法都将受到高度赞赏

您的
zext
指令使用
I
,但您要在
I
之前插入它。创建
IRBuilder
时,应在
I
之后作为插入点传入指令。例如:

 IRBuilder<> IRB(I->getNextNode());
irbuilderirb(I->getNextNode());

您的
zext
指令使用
I
,但您要在
I
之前插入它。创建
IRBuilder
时,应在
I
之后作为插入点传入指令。例如:

 IRBuilder<> IRB(I->getNextNode());
irbuilderirb(I->getNextNode());