2013-10-24 64 views
2

我在寫一個LLVM函數通道,可以相當積極地轉換某些函數。最終最終會刪除舊的一組區塊,並用完全不同的區塊替換它們。但是,之後運行的循環展開器(LoopUnrollPass)無法在轉換後的函數中找到循環。 (轉換後的版本應該有自然循環。)LLVM保留環路分析

重新創建函數後,我有什麼要戳嗎?如何觸發迴路檢測器再次運行?最後,當我轉換函數時,還需要進行其他分析嗎?

回答

5

首先,爲防萬一你跳過它,閱讀理解Writing and LLVM Pass文檔頁面非常重要。

當您的通行證運行時,它說明函數/模塊是否被修改。通過經理應該將其作爲線索,以重新運行下一次通行證所需的所有分析,除非您的通行證聲明保留了通行證(與addPreserved一致)。你可以看到在其getAnalysisUsage方法,通過LoopUnroll需要分析的列表:

/// This transformation requires natural loop information & requires that 
/// loop preheaders be inserted into the CFG... 
/// 
virtual void getAnalysisUsage(AnalysisUsage &AU) const { 
    AU.addRequired<LoopInfo>(); 
    AU.addPreserved<LoopInfo>(); 
    AU.addRequiredID(LoopSimplifyID); 
    AU.addPreservedID(LoopSimplifyID); 
    AU.addRequiredID(LCSSAID); 
    AU.addPreservedID(LCSSAID); 
    AU.addRequired<ScalarEvolution>(); 
    AU.addPreserved<ScalarEvolution>(); 
    AU.addRequired<TargetTransformInfo>(); 
    // FIXME: Loop unroll requires LCSSA. And LCSSA requires dom info. 
    // If loop unroll does not preserve dom info then LCSSA pass on next 
    // loop will receive invalid dom info. 
    // For now, recreate dom info, if loop is unrolled. 
    AU.addPreserved<DominatorTree>(); 
} 
+0

是的,謝謝,我已經通過文件讀取。我現在只是重新閱讀它。我的通行證不使用任何分析或有任何預先要求。現在傳遞所以我離開getAnalysisUsage未定義。文件說這應該使所有先前的通行證無效。我會一直在想。 – Tim

+0

我注意到在函數過程中插入新函數是非法的,我調用了getOrInsertFunction。我想知道這是否違法。其他一切似乎都奏效。 – Tim

+0

@Tim:在函數傳遞中插入新函數確實是非法的。順便說一句,你可以在你傳遞後把IR轉儲到一個文件中,然後在它上面分別運行'opt',要求它調用循環展開,看看它是否有效。這樣你可以將你的傳球與其他傳球分開。也許你在IR中產生的東西並不是LoopUnroll的喜好 –