LLVM传递给计数向量类型指令

时间:2016-03-11 20:50:59

标签: c++ llvm

我正在尝试编写一个计算向量类型指令的LLVM传递 有关如下指示:

  %24 = or <2 x i64> %21, %23
  %25 = bitcast <16 x i8> %12 to <8 x i16>
  %26 = shl <8 x i16> %25, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
  %27 = bitcast <8 x i16> %26 to <2 x i64>

我写了这段代码:

for (auto &F : M) {      
    for (auto &B : F) {
            for (auto &I : B) {

            if (auto* VI = dyn_cast<InsertElementInst>(&I)) {
                     Value* op = VI->getOperand(0);
                     if (op->getType()->isVectorTy()){
                         ++vcount;
                     }

            }

但由于某些原因,if (auto* VI = dyn_cast<InsertElementInst>(&I))永远不会满足。 知道为什么吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

InsertElementInst是一个特定的指令(将一个元素插入一个向量) - 并且在你的指令列表中没有。

您可能希望 dyn_cast定期使用I中的Instruction

[我个人会使用一个函数或模块传递类作为基础,所以你只需要实现代码的内部循环,但这更像是“你应该如何做事” ,而不是你必须要做的事情才能使它发挥作用]。

答案 1 :(得分:0)

在LLVM中,指令的结果相同。所以举个例子

%25 = bitcast <16 x i8> %12 to <8 x i16>

当您将指令I转换为值时,您将获得%25

Value* psVal = cast<Value>(&I);

然后你可以通过getType() - &gt; isVectorTy()检查它是否是矢量类型。

另外,我建议您查看llvm值的继承图以获得更多说明

此处http://llvm.org/docs/doxygen/html/classllvm_1_1Value.html