2013-03-09 37 views
2

在LLVM中,我試圖找出指令是否存在於流量控制中(如果/ switch/for)等,我必須在IR級別執行此操作。僞代碼如下所示。如何找到一個llvm ::指令是否在流量控制內?

if cond 
    inst 
endif 

我在看功能的SCC,但我不知道如何推導出不確定的指令沒有流量控制或不存在於。

以本IR的萬花筒示例爲例。

declare double @foo() 

declare double @bar() 

define double @baz(double %x) { 
entry: 
    %ifcond = fcmp one double %x, 0.000000e+00 
    %0 = call double @foo() 
    br i1 %ifcond, label %then, label %else 

then:  ; preds = %entry 
    %calltmp = call double @foo() 
    br label %ifcont 

else:  ; preds = %entry 
    %calltmp1 = call double @bar() 
    br label %ifcont 

ifcont:  ; preds = %else, %then 
    %iftmp = phi double [ %calltmp, %then ], [ %calltmp1, %else ] 
    %1 = call double @foo() 
    ret double %iftmp 
} 

所以在上面的IR中,我們可以說我想找出所有對函數foo的調用。所以在入口塊中,我們有一個調用%0和一個在then:塊中,我們有另一個調用foo和ifcont:塊中的最後一個調用。

所以問題是,儘管then:塊中的調用屬於if塊生成的代碼,我該如何推斷?即入口塊& ifcont塊將被執行,然而根據條件,不必執行then:塊。

有人可以給我一些指針嗎? 謝謝

編輯:給一些更多的想法,統治者樹可能有助於確定這一點,但我還沒有一個算法。

+0

難道你只是迭代一個基本塊的說明,如下所述:http://www.llvm.org/docs/ProgrammersManual.html#iterating-over-the-instruction-in-a-basicblock? – PetrosB 2013-03-09 23:17:15

+0

迭代塊將不會給我們這個答案。原因如上例所示,then:塊可能會或可能不會被執行。 – ssarangi 2013-03-09 23:20:03

回答

4

這裏的指令後支配from Wikipedia的定義:

類似於上述主導地位的定義,一個節點z爲到 支配後一個節點n,如果到的出口節點的所有路徑,所述從n開始的圖 必須經過z。

在我看來,在你的情況下,你正在尋找後期支配函數中第一條指令的調用。從第一條指令開始的每條路徑都必須達到這樣的調用,根據後統治的定義。這是你需要的嗎?

您可以運行似乎支持後控制分析的DominatorTree通行證。

+0

謝謝你回答這個Eli。這正是我想要的。所以基本上我打算從你的答案中做的是找到所有未被入口塊支配的基本塊。如果任何塊沒有後控制,那麼我可以搜索該塊來查看是否能找到我感興趣的指令。因此,如果在非後期支配的塊中找到指令,則該指令可能是被認爲是在流量控制之內(來自更高級別)。這聽起來合理嗎? – ssarangi 2013-03-10 00:56:19

+0

@ssarangi:我認爲你寧願尋找後進佔據主導地位的街區。這意味着從入口到出口的所有路徑都經過這些塊,這就是你想要的。然後在這些塊中尋找你的電話。 – 2013-03-10 00:58:26