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

时间:2018-05-03 10:09:48

标签: llvm dominate

我实现了一个函数传递,它遍历基本块指令并跟踪所有类型为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()); 命令似乎创建了一个指令并未主导所有用途!问题。

我理解问题的性质(herehere存在类似的问题)。

我对这个传递应用于没有 if 语句或任何其他控制流语句的玩具程序感到困惑,但我仍然遇到这个问题。

错误消息:

    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 指令命名一个常数,其计数器数字 比前一条指令更强 - 我认为这是问题,但我不知道为什么我的通行证会这样做!!!

以下是申请通行证前玩具程序的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
}

另外,请注意有问题的指令在终止符之前 - 我再次认为这是相关的。

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

1 个答案:

答案 0 :(得分:2)

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

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