2013-10-24 31 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的喜好 –