Clang SplitEdge后的LLVM区域

Clang SplitEdge后的LLVM区域,clang,llvm,control-flow-graph,Clang,Llvm,Control Flow Graph,我有以下几个问题 此CFG的区域为 [0] entry => if.end12 [1] if.else => if.end 我正在处理的优化过程需要if.then块成为LLVM区域。因此,我使用了SplitEdge函数(在BasicBlockUtils中)来分割边缘if.then->if.end12。现在我有下面的CFG 但是我的区域还是 [0] entry => if.end12 [1] if.else => if.end if.then=>if.the

我有以下几个问题

此CFG的区域为

[0] entry => if.end12
  [1] if.else => if.end
我正在处理的优化过程需要
if.then
块成为LLVM区域。因此,我使用了SplitEdge函数(在BasicBlockUtils中)来分割边缘
if.then->if.end12
。现在我有下面的CFG

但是我的区域还是

[0] entry => if.end12
  [1] if.else => if.end
if.then=>if.then.split
不是区域。有人能解释为什么这不是LLVM区域吗?这是一个单入口单出口控制流程。为什么它不是一个地区

另外,修改controlflow后重新计算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);
RegionInfo&RI=getAnalysis().getRegionInfo();
支配树&DT=getAnalysis().getDomTree();
DominanceFrontier&DF=getAnalysis().getDominanceFrontier();
PostDominatorTree&PDT=getAnalysis().getPostDomTree();
DT.重新计算(F);
PDT.重新计算(F);
重新计算(F,&DT,&PDT,&DF);
LLVM verion 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
0。程序参数:/home/workspace/llvm_install/bin/opt-load/home/workspace/llvm project/build/lib/llvmcfmerge.so-cfmerge-view cfg only
1.正在模块“”上运行传递“函数传递管理器”。
2.正在运行传递函数'@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信号处理器(int)(/home/workspace/llvm_install/bin/opt+0x2991f43)
#3 0x00007fc487be33c0\uuuu restore\u rt(/lib/x86\u64-linux-gnu/libpthread.so.0+0x153c0)
#4 0x0000560946b7a6a0 llvm::RegionInfoBase::isRegion(llvm::BasicBlock*,llvm::BasicBlock*)常量

无需重新运行过程,请在修改cfg后调用重新计算。DT.重新计算(F);PDT.重新计算(F);DF.分析(DT);RI.重新计算(F,DT,PDT,DF);您的代码似乎没有更新DF。