假設我有我的CFG(其中包括)兩個基本塊A和B,從A到B的邊緣,我需要做到以下幾點:直播值
- 得到的集合S跨 實時值該邊緣(它可以是一個 overapproximation,即,它可能 包含不活 了值)
- 地圖它們中的每另一個 值(S-> S')
- 更換 - 在B和它的 接班人 - 所有的使用與映射值(S')值 S中第
是否LLVM提供了一種簡單的方法做的第一點和第三點(因爲我不能似乎能夠找到它)?如果沒有,你有什麼建議如何做到這一點?
注:crossposted LLVM的郵件列表
假設我有我的CFG(其中包括)兩個基本塊A和B,從A到B的邊緣,我需要做到以下幾點:直播值
是否LLVM提供了一種簡單的方法做的第一點和第三點(因爲我不能似乎能夠找到它)?如果沒有,你有什麼建議如何做到這一點?
注:crossposted LLVM的郵件列表
上我沒有明確的回答你的問題,但導演跟隨,那來到我的腦海。我希望它能以某種方式幫助你。
首先,我會檢查出"Iterating over the Instructions in a BasicBlock"和"Iterating over def-use & use-def chains" from LLVM Programmers Manual。它給出了一個想法,即如何迭代基本塊和這個值的用戶的指令。因爲您需要知道邊緣上的生命值,我會檢查出"Iterating over the BasicBlocks in a Function",並嘗試確定用戶(例如迭代)的位置,例如const BasicBlock* llvm::Instruction::getParent()const。
如果信息,即用戶放置是不夠的,你可能想利用[統治者和postdominators分析]中,檢查出:
這可以幫助你確定塊或指令,有什麼可以幫助您與您的創作組之間的優勢關係。
對不起,但什麼是'活的價值'? – lurscher 2011-06-14 19:31:28
@lurscher在SSA中有一個值(你也可以把它稱爲「變量」,但它不正確,因爲在SSA中你不能在定義之後改變它的內容)被認爲是活的,如果它將在下面再次使用說明。 – CAFxX 2011-06-14 19:42:36
這些SSA寄存器中的大部分在優化過後都會被修剪掉,所以我想你的問題的答案很大程度上取決於你是否希望在優化過程發生之前或之後發生這些設置 – lurscher 2011-06-14 19:45:42