[LLVMdev] findNearestCommonDominator for PostDominatorTree
Tobias Grosser
grosser at fim.uni-passau.de
Sun Mar 7 03:25:13 PST 2010
On 03/07/2010 11:09 AM, Jochen Wilhelmy wrote:
> Hi!
Hi Jochen,
> I'd like to find the point where the control flow joins after a branch.
>
> e.g. if I have the following function
>
> if (a< b)
> foo1();
> else
> foo2();
> bar();
>
> Then the control flow splits at the basic block containing a< b with
> a branch as terminator instruction. At the basic block with bar() the
> control
> flow joins again (at first my control flow graph does not have loops).
>
> I would think I have to calculate the post dominator tree and then call
> findNearestCommonDominator on the two branches, but this function
> is missing. Does this have a reason? I would think it's just
>
> inline BasicBlock *findNearestCommonDominator(BasicBlock *A, BasicBlock
> *B) {
> return DT->findNearestCommonDominator(A, B);
> }
>
> like for llvm::DominatorTree. Is it possible to add it?
It was probably just not added, as the PostDominatorTree is not used a
lot at the moment.
I added it. It is a trivial change.
http://llvm.org/viewvc/llvm-project?rev=97915&view=rev
It should just work, as the code paths are the same for both Dominator
and PostDominatorTree in this case.
In general the PostDominatorTree works well. I use it for the RegionInfo
pass and it works flawless, but I think there may still be some bugs in
cases with infinite loops. If this is the case please report back. They
should be fixed anyways, as they are probably general PostDominatorTree
bugs and not especially related to the findNearestCommonDominator()
function.
> The method of finding the control flow join should also work for this case:
Yes.
> if (a< b)
> {
> foo1();
> if (c< d) goto label;
> foo2();
> }
> else
> {
> foo3();
> label:
> foo4();
> }
> bar();
>
> - Jochen
Tobi
More information about the llvm-dev
mailing list