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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...