我正在尝试编写一个计算向量类型指令的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))
永远不会满足。
知道为什么吗?
提前致谢。
答案 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值的继承图以获得更多说明