2011-04-22 33 views
0

在LLVM過程中,我想記錄一個循環的循環計數。我做的一部分是在每個循環的標題塊的終止符之前插入一個函數調用。我發現這個方法工作不好,因爲如果一個循環有n次迭代,頭塊將被執行n + 1次。這個事實適用於「for」和「while」循環,但它不適用於「do while」循環。我將函數調用插入到「for」和「while」循環的第二個塊中,並插入到「do while」循環的第一個塊中。這隻有在我事先知道目標循環的類型時才起作用,這是純粹的比特碼所不可能的。我的問題是:是否有一種通用的方式(處理各種循環)來插入一個函數調用,該函數調用的次數與迭代次數完全相同。循環頭部的執行頻率

回答

0

將函數調用放在循環主體的開始處。你爲什麼試圖把它放在標題中?

for (...) { 
    increment_trip_count(); 
    ... 
} 
+0

如何知道哪個基本塊是循環體的起始塊?我測試並發現,在很多情況下,循環頭部塊與循環中包含的第一個基本塊相同。 – dalibocai 2011-04-23 01:40:17

0

如果插入的循環體開頭的函數調用,你會得到正確的計數。

+0

問題是如何知道循環體的起始塊。 – dalibocai 2011-04-23 01:41:15

+0

循環體是通常放置在大括號內的部分。如果你打電話給你的功能,它會告訴你身體被執行了多少次,這就是你要求的,不是嗎? – Lindydancer 2011-04-23 06:40:53

+0

在源代碼級別,它當然是正確的。但是,我的問題是針對llvm的。在llvm中的循環結構有一個基本塊列表。但是,第一個塊將執行n + 1次,其中n是循環的循環跳閘次數。這適用於「for」和「while」循環,但對於「do while」循環來說並不正確,其中第一個塊將被執行n次。 – dalibocai 2011-04-25 01:29:09