微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SplitEdge之后的LLVM区域

如何解决SplitEdge之后的LLVM区域

我有以下CFG。

enter image description here

此CFG的区域为

[0] entry => if.end12
  [1] if.else => if.end

正在进行的优化过程要求if.then块为LLVM区域。因此,我使用了SplitEdge函数(在BasicBlockUtils中)来分割边缘if.then -> if.end12。现在我有以下CFG,

enter image description here

但是我的地区仍然是

[0] entry => if.end12
  [1] if.else => if.end

if.then=>if.then.split不是区域。有人可以解释为什么这不是LLVM区域吗?这是单入口单出口控制流程。为什么不是地区?

修改控制流后重新计算LLVM区域的正确方法是什么?

以下方法给我分割if.then -> if.end12后在函数上运行时出现运行时错误

   regioninfo &RI = getAnalysis<regioninfoPass>().getregioninfo();
   DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
   DominanceFrontier &DF = getAnalysis<DominanceFrontierWrapperPass>().getDominanceFrontier();
   PostDominatorTree &PDT = getAnalysis<PostDominatorTreeWrapperPass>().getPostDomTree();

   DT.recalculate(F);
   PDT.recalculate(F);
   RI.recalculate(F,&DT,&PDT,&DF);

LLVM版本11.0.0中的运行时错误

0. Program arguments: /home/workspace/llvm_install/bin/opt -load /home/workspace/llvm-project/build/lib/LLVMCFMerger.so -cfmerger -view-cfg-only
1. Running pass 'Function Pass Manager' on module '<stdin>'.
2. Running pass  on function '@foo'
 #0 0x000056094798307a llvm::sys::printstacktrace(llvm::raw_ostream&) (/home/workspace/llvm_install/bin/opt+0x299407a)
 #1 0x0000560947980df4 llvm::sys::RunSignalHandlers() (/home/workspace/llvm_install/bin/opt+0x2991df4)
 #2 0x0000560947980f43 SignalHandler(int) (/home/workspace/llvm_install/bin/opt+0x2991f43)
 #3 0x00007fc487be33c0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x153c0)
 #4 0x0000560946b7a6a0 llvm::regioninfoBase<llvm::RegionTraits<llvm::Function> >::isRegion(llvm::BasicBlock*,llvm::BasicBlock*) const

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。