<div dir="ltr">Cool, thanks!  The last expression is indeed the way to go for me. <br></div><br><div class="gmail_quote"><div dir="ltr">On Fri, 3 Aug 2018 at 15:02, Artem Dergachev <<a href="mailto:noqnoqneo@gmail.com">noqnoqneo@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div text="#000000" bgcolor="#FFFFFF">
    <br>
    <br>
    <div class="m_6463236416835500423moz-cite-prefix">On 8/3/18 2:53 PM, Artem Dergachev
      wrote:<br>
    </div>
    <blockquote type="cite">
      
      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.<br>
      <br>
      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.<br>
    </blockquote>
    <br>
    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'. <br>
    <br>
    <blockquote type="cite"> <br>
      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.<br>
      <br>
      <br>
      <div class="m_6463236416835500423moz-cite-prefix">On 8/3/18 2:35 PM, Gábor Horváth via
        cfe-dev wrote:<br>
      </div>
      <blockquote type="cite">
        
        <div dir="ltr">
          <div>Hi!</div>
          <div><br>
          </div>
          <div>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.</div>
          <div><br>
          </div>
          <div>Let's consider the following simple code snippet:</div>
          <div><br>
          </div>
          <div><span style="font-family:monospace,monospace"><font size="2">void g(bool a, bool b) {<br>
                    if (a || b) {<br>
                        body();<br>
                    } else {<br>
                        body2();<br>
                    }<br>
                }</font></span></div>
          <div><br>
          </div>
          <div>We get the following CFG:</div>
          <div><br>
          </div>
          <div><span style="font-family:monospace,monospace"><font size="2"> [B1]<br>
                   1: body2<br>
                   2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay,
                void (*)(void))<br>
                   3: [B1.2]()<br>
                   Preds (1): B3<br>
                   Succs (1): B0<br>
                <br>
                 [B2]<br>
                   1: body<br>
                   2: [B2.1] (ImplicitCastExpr, FunctionToPointerDecay,
                void (*)(void))<br>
                   3: [B2.2]()<br>
                   Preds (2): B3 B4<br>
                   Succs (1): B0<br>
                <br>
                 [B3]<br>
                   1: b<br>
                   2: [B3.1] (ImplicitCastExpr, LValueToRValue, _Bool)<br>
                   T: if [B4.2] || [B3.2]<br>
                   Preds (1): B4<br>
                   Succs (2): B2 B1<br>
                <br>
                 [B4]<br>
                   1: a<br>
                   2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool)<br>
                   T: [B4.2] || ...<br>
                   Preds (1): B5<br>
                   Succs (2): B2 B3</font></span><br>
          </div>
          <div><br>
          </div>
          <div>The terminator condition for <span style="font-family:monospace,monospace">[B4]</span> is (a
            cast above) <span style="font-family:monospace,monospace">a</span>.
            This is pretty intuitive. This value will determine which
            branch do we take when we leave the basic block.</div>
          <div><br>
          </div>
          <div>The terminator condition for <span style="font-family:monospace,monospace">[B3]</span>,
            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?</div>
          <div><br>
          </div>
          <div>Regards,</div>
          <div>Gabor<br>
          </div>
          <div><br>
          </div>
        </div>
        <br>
        <fieldset class="m_6463236416835500423mimeAttachmentHeader"></fieldset>
        <pre class="m_6463236416835500423moz-quote-pre">_______________________________________________
cfe-dev mailing list
<a class="m_6463236416835500423moz-txt-link-abbreviated" href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>
<a class="m_6463236416835500423moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>
</pre>
      </blockquote>
      <br>
    </blockquote>
    <br>
  </div>

</blockquote></div>