[LLVMdev] How to Check whether BasicBlock resides in a conditional branch

Iaroslav Markov ymarkov at cs.stonybrook.edu
Sat Aug 25 09:56:27 PDT 2012


Actually, you should read
>And after that for all the BB you have visited more than once, you try to find a parent that has a branch instruction as a terminator. Additionally you ensure that there are no BB with branches as terminators on your way.

like this:
And after that for all the BB you have visited more than once, you try to find a parent that has a branch instruction that fork the flow as a terminator. Additionally you ensure that there are no BB with branches that are not forks as terminators on your way.

But anyway ignore this, this is ineffective - the flow thing works faster.

--
Yaroslav Markov
PhD student in Computer Science
Stony Brook University
________________________________________
From: Jianfei Hu [hujianfei258 at gmail.com]
Sent: Saturday, August 25, 2012 12:29 PM
To: Iaroslav Markov
Cc: LLVMdev at cs.uiuc.edu
Subject: Re: [LLVMdev] How to Check whether BasicBlock resides in a conditional branch

2012/8/25 Iaroslav Markov <ymarkov at cs.stonybrook.edu>:
> Can't you do it by performing some analysis on CFG? You can traverse that structure with BFS. And after that for all the BB you have visited more than once, you try to find a parent that has a branch instruction as a terminator. Additionally you ensure that there are no BB with branches as terminators on your way. If such parent exist, you mark
that there is exist a direct connection between this parent and BB.

What do you mean by "there are no BB with branches as terminators on
your way" ?  I remember All BB end with a terminator....
Well, I think if the basicblock only has one  predecessor block, it
also means its predecessor and iteself have direct connection.
Do you mean this?

>
> Anyway I think it's impossible to detect all of such BB - you have indirect jumps, you can have a complicated branch structure with implicit flows that are hard to analyse - like this:
>
> a = 0;
> b = 1;
> if (X == 1)
>   a = 1;
> if (X == 0)
>   b = 0;
> if (a  == 0)
>   Y = 0;
> if (b == 1)
>   Y = 1;
> // in the end  Y = X
> if(X == Y)
>   BasicBlock C
> endif
>
> BasicBlock D
>
> In this example BasicBlock C is *must* executed, however it's hard to detect that it is.

Yes, the precise execution condtion may be difficut to get. I just
want rough results.

Thanks for your suggestion!

>
> --
> Yaroslav Markov
> PhD student in Computer Science
> Stony Brook University
> ________________________________________
> From: llvmdev-bounces at cs.uiuc.edu [llvmdev-bounces at cs.uiuc.edu] on behalf of Jianfei Hu [hujianfei258 at gmail.com]
> Sent: Saturday, August 25, 2012 8:44 AM
> To: LLVMdev at cs.uiuc.edu
> Subject: [LLVMdev] How to Check whether BasicBlock resides in a conditional     branch
>
> Hello All,
>
> I want to dertermine whether a basicblock is in a conditional branch. such as,
>
> //=============================
> if a > 2 // BasicBlock A
> then
>
> BasicBlock B
>
> endif
>
> BasicBlock C
> //=============================
> What I want to identify is BasicBlock B, which is in a condtional
> block. but C is not.
> In other words, I want to distinguish BasicBlocks that  * must *  be
> executed and that *may* be executed.
>
> CFG's iterator may not help, as  LLVM IR br would be:
> A:
> br %cmp,  %lable.B,  %label.C
>
> B
> br C
>
> C
>
> both of the blocks could be operand of br instruction.
>
> code in C *must be executed*, but B is not.
>
>
> Is there any availiable API in LLVM to distinguish them?
>
> Thanks.
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev



More information about the llvm-dev mailing list