2
我在写一个LLVM函数通道,可以相当积极地转换某些函数。最终最终会删除旧的一组区块,并用完全不同的区块替换它们。但是,之后运行的循环展开器(LoopUnrollPass)无法在转换后的函数中找到循环。 (转换后的版本应该有自然循环。)LLVM保留环路分析
重新创建函数后,我有什么要戳吗?如何触发回路检测器再次运行?最后,当我转换函数时,还需要进行其他分析吗?
我在写一个LLVM函数通道,可以相当积极地转换某些函数。最终最终会删除旧的一组区块,并用完全不同的区块替换它们。但是,之后运行的循环展开器(LoopUnrollPass)无法在转换后的函数中找到循环。 (转换后的版本应该有自然循环。)LLVM保留环路分析
重新创建函数后,我有什么要戳吗?如何触发回路检测器再次运行?最后,当我转换函数时,还需要进行其他分析吗?
首先,为防万一你跳过它,阅读理解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>();
}
是的,谢谢,我已经通过文件读取。我现在只是重新阅读它。我的通行证不使用任何分析或有任何预先要求。现在传递所以我离开getAnalysisUsage未定义。文件说这应该使所有先前的通行证无效。我会一直在想。 – Tim
我注意到在函数过程中插入新函数是非法的,我调用了getOrInsertFunction。我想知道这是否违法。其他一切似乎都奏效。 – Tim
@Tim:在函数传递中插入新函数确实是非法的。顺便说一句,你可以在你传递后把IR转储到一个文件中,然后在它上面分别运行'opt',要求它调用循环展开,看看它是否有效。这样你可以将你的传球与其他传球分开。也许你在IR中产生的东西并不是LoopUnroll的喜好 –