[cfe-dev] CFG Terminator Conditions
Artem Dergachev via cfe-dev
cfe-dev at lists.llvm.org
Tue Aug 7 15:48:46 PDT 2018
If it turns out that in some corner-cases the last expression is not the
terminator condition, pls let me know^^
Otherwise we might as well add an API to retrieve it, so that people
could rely on it.
On 8/7/18 3:46 PM, Gábor Horváth wrote:
> Cool, thanks! The last expression is indeed the way to go for me.
>
> On Fri, 3 Aug 2018 at 15:02, Artem Dergachev <noqnoqneo at gmail.com
> <mailto:noqnoqneo at gmail.com>> wrote:
>
>
>
> On 8/3/18 2:53 PM, Artem Dergachev wrote:
>> The terminator for [B3] is not the binary operator; it's the
>> whole if-statement. I guess it's kind of generic if-statement
>> logic here. It wouldn't make that much sense to change the
>> terminator here to 'b' if in all other places it's still the
>> if-statement. And i think we don't really want to rewrite AST to
>> create an 'if (b)' statement only to use it as a terminator,
>> that'd be pretty weird.
>>
>> But it might make sense if we change the behavior in all other
>> places to avoid using the if-statement as a terminator. I'm not
>> sure how much information would be lost in this case; it might
>> work if we simply say in all places "here's the condition
>> expression, compute it, then jump to this or that block depending
>> on the value" and simply never store control flow statements in
>> the CFG. We might as well separate "terminator condition
>> expression" from "terminator control flow statement", not sure if
>> i'm making any sense right now.
>
> On second thought, it's exactly how it works right now, if we
> declare that the "terminator condition expression" is just the
> last expression in the block. I.e., for [B4] the condition is 'a'
> and the terminator is '||', for [B3] the condition is 'b' and the
> terminator is 'if'.
>
>>
>> The logic in the Analyzer to act upon this part of CFG is pretty
>> weird, cf. ExprEngine::VisitLogicalExpr(). It definitely needs a
>> cleanup, probably with the help of a more easy-to-read CFG.
>>
>>
>> On 8/3/18 2:35 PM, Gábor Horváth via cfe-dev wrote:
>>> Hi!
>>>
>>> I found the terminator condition for binary operators a bit
>>> unintuitive in the CFG. I was wondering if I am missing
>>> something or it is a possible improvement.
>>>
>>> Let's consider the following simple code snippet:
>>>
>>> void g(bool a, bool b) {
>>> if (a || b) {
>>> body();
>>> } else {
>>> body2();
>>> }
>>> }
>>>
>>> We get the following CFG:
>>>
>>> [B1]
>>> 1: body2
>>> 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, void
>>> (*)(void))
>>> 3: [B1.2]()
>>> Preds (1): B3
>>> Succs (1): B0
>>>
>>> [B2]
>>> 1: body
>>> 2: [B2.1] (ImplicitCastExpr, FunctionToPointerDecay, void
>>> (*)(void))
>>> 3: [B2.2]()
>>> Preds (2): B3 B4
>>> Succs (1): B0
>>>
>>> [B3]
>>> 1: b
>>> 2: [B3.1] (ImplicitCastExpr, LValueToRValue, _Bool)
>>> T: if [B4.2] || [B3.2]
>>> Preds (1): B4
>>> Succs (2): B2 B1
>>>
>>> [B4]
>>> 1: a
>>> 2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool)
>>> T: [B4.2] || ...
>>> Preds (1): B5
>>> Succs (2): B2 B3
>>>
>>> The terminator condition for [B4] is (a cast above) a. This is
>>> pretty intuitive. This value will determine which branch do we
>>> take when we leave the basic block.
>>>
>>> The terminator condition for [B3], however, is the whole binary
>>> or expression. I would expect it to be the right hand side of
>>> the logical or. What do you think? What is the reason that we
>>> have the whole expression here?
>>>
>>> Regards,
>>> Gabor
>>>
>>>
>>> _______________________________________________
>>> cfe-dev mailing list
>>> cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180807/8a842d75/attachment.html>
More information about the cfe-dev
mailing list