在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:塊。
有人可以給我一些指針嗎? 謝謝
編輯:給一些更多的想法,統治者樹可能有助於確定這一點,但我還沒有一個算法。
難道你只是迭代一個基本塊的說明,如下所述:http://www.llvm.org/docs/ProgrammersManual.html#iterating-over-the-instruction-in-a-basicblock? – PetrosB 2013-03-09 23:17:15
迭代塊將不會給我們這個答案。原因如上例所示,then:塊可能會或可能不會被執行。 – ssarangi 2013-03-09 23:20:03