2016-03-11 42 views
1

我想寫一個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))是永遠不會滿足。 任何想法爲什麼?

在此先感謝。

回答

0

InsertElementInst是一個特定的指令(將一個元素插入到一個向量中) - 並且您的instructiokns列表中沒有任何指令。

你可能想 dyn_cast到正規 使用InstructionI,因爲它是。我個人會使用一個函數或模塊傳遞類作爲基礎,所以你只需要實現你的代碼的內部循環,但這更像是「這是你應該如何做的事情「,而不是你要做的事情]。

+0

你不會需要'dyn_cast'可言,因爲'I'應該已經是一個'指令&'這裏。 –

+0

@Ismail:如此修改。 –

+0

感謝您的回答。但我不明白我將如何計算通過使用指令返回矢量類型的指令。 – Dinz

0

在LLVM中,的指令是,與其結果相同。所以對於一個例子

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

當你施放說明我重視你%25

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

,然後你可以檢查它是否是矢量型的或不的getType() - > isVectorTy( )。

此外,我建議你看看LLVM價值的繼承圖更多的澄清

這裏http://llvm.org/docs/doxygen/html/classllvm_1_1Value.html

+0

是的。這正是我想要的。謝謝。 – Dinz