對於一個簡單的LLVM IR爲:瞭解LLVM SelectionDAG
define i32 @test(i32 %X, i32 %Y) {
%Z = udiv i32 %X, %Y
ret i32 %Z
}
的SelectionDAG圖是比我想象的更復雜:
爲什麼CopyFromReg
需要,爲什麼不能連接vreg0
和vreg1
直接到udiv
?
我應該如何讀取圖表,從EntryToken
到GraphRoot
或相反的方向?
對於一個簡單的LLVM IR爲:瞭解LLVM SelectionDAG
define i32 @test(i32 %X, i32 %Y) {
%Z = udiv i32 %X, %Y
ret i32 %Z
}
的SelectionDAG圖是比我想象的更復雜:
爲什麼CopyFromReg
需要,爲什麼不能連接vreg0
和vreg1
直接到udiv
?
我應該如何讀取圖表,從EntryToken
到GraphRoot
或相反的方向?
Entry Token是函數的入口,它用於「鏈接」(藍色鏈接)所有有副作用的操作。 我認爲CopyFromReg和CopyToReg在這裏是爲了實現函數的調用約定。
函數的參數被調用約定特定並且它們在SelectionDAG(SelectionDAGISel::SelectAllBasicBlocks
呼叫SelectionDAGISel::LowerArguments
)的施工過程中下降時,特定結構LowerArguments通常會產生CopyFromReg
來表示虛擬寄存器中的參數作爲SDValue
和鏈CopyFromReg
到SelectionDAG。
額外CopyFromReg被附接到保持鏈,以EntryToken,並存儲其被設計成不成爲RegisterSDNode
一部分,就像DebugLoc
其他信息。
這裏是CopyFromReg沒有連接的例子(藍色虛線箭頭是丟失):
http://llvm.org/docs/doxygen/html/ISDOpcodes_8h_source.html你可以在這裏找到所有標籤的參考
CopyToReg
CopyToReg - 該節點有三個操作數:一個鏈,一個設置爲該值的寄存器號和一個值。
CopyFromReg
CopyFromReg - 此節點指示輸入值是一個虛擬或物理寄存器,它定義在此SelectionDAG範圍之外。寄存器可從RegisterSDNode對象中獲得。
P.S對不起,我是新用戶。
您應該引用該鏈接的相關信息,而不是僅發佈鏈接。這確保瞭如果鏈接死亡,信息不會丟失。 –
任何證明EntryToken是函數的輸入?我對此有疑問,因爲SelectionDAG是用於基本塊,而不是功能。 – Thomson
那麼在給出的例子中,函數中只有一個基本塊。當他問「我應該如何閱讀圖表」時,我理解他的問題,就像輸入令牌是結束的開始一樣。 – Joky