2014-03-05 45 views
5

對於一個簡單的LLVM IR爲:瞭解LLVM SelectionDAG

define i32 @test(i32 %X, i32 %Y) { 
    %Z = udiv i32 %X, %Y 
    ret i32 %Z 
    } 

的SelectionDAG圖是比我想象的更復雜:

image of SelectionDAG graph

爲什麼CopyFromReg需要,爲什麼不能連接vreg0vreg1直接到udiv

我應該如何讀取圖表,從EntryTokenGraphRoot或相反的方向?

回答

1

Entry Token是函數的入口,它用於「鏈接」(藍色鏈接)所有有副作用的操作。 我認爲CopyFromReg和CopyToReg在這裏是爲了實現函數的調用約定。

+0

任何證明EntryToken是函數的輸入?我對此有疑問,因爲SelectionDAG是用於基本塊,而不是功能。 – Thomson

+0

那麼在給出的例子中,函數中只有一個基本塊。當他問「我應該如何閱讀圖表」時,我理解他的問題,就像輸入令牌是結束的開始一樣。 – Joky

2

函數的參數被調用約定特定並且它們在SelectionDAGSelectionDAGISel::SelectAllBasicBlocks呼叫SelectionDAGISel::LowerArguments)的施工過程中下降時,特定結構LowerArguments通常會產生CopyFromReg來表示虛擬寄存器中的參數作爲SDValue和鏈CopyFromRegSelectionDAG

額外CopyFromReg被附接到保持鏈,以EntryToken,並存儲其被設計成不成爲RegisterSDNode一部分,就像DebugLoc其他信息。

這裏是CopyFromReg沒有連接的例子(藍色虛線箭頭是丟失):

enter image description here

-1

http://llvm.org/docs/doxygen/html/ISDOpcodes_8h_source.html你可以在這裏找到所有標籤的參考

CopyToReg
CopyToReg - 該節點有三個操作數:一個鏈,一個設置爲該值的寄存器號和一個值。

CopyFromReg
CopyFromReg - 此節點指示輸入值是一個虛擬或物理寄存器,它定義在此SelectionDAG範圍之外。寄存器可從RegisterSDNode對象中獲得。

http://llvm.org/docs/doxygen/html/namespacellvm_1_1ISD.html#a22ea9cec080dd5f4f47ba234c2f59110a93bc27ca4d9e211c54b0d9efb660f080手冊。

P.S對不起,我是新用戶。

+0

您應該引用該鏈接的相關信息,而不是僅發佈鏈接。這確保瞭如果鏈接死亡,信息不會丟失。 –