<div dir="ltr"><div>Hi Tobias,</div><div><br></div><div>     Thanks so much for the quick response. Your approach fixes the issue. </div><div>     On a bigger context, would it make more sense to make the region exit part of the region? For example, a while loop gets lowered down to LLVM IR contains while.cond, while.body and while.end. If one tries to use RegionInfo as a substitute for structural analysis, she might think while.end should belong to the region/structure ... is it necessary to exclude the exit from being part of the region or both ways are equally correct in terms of uniquely representing regions?</div>
<div><br></div><div>Best,</div><div>Paul</div><div>     </div><div><br></div><img src="cid:ii_145bef757b76a7b2" alt="Inline image 1" width="533.4539682539682" height="562"><br>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, May 2, 2014 at 4:42 PM, Tobias Grosser <span dir="ltr"><<a href="mailto:tobias@grosser.es" target="_blank">tobias@grosser.es</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 02/05/2014 23:26, Paul Vario wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Fellows,<br>
<br>
    I notice an unexpected behavior in RegionInfo's block_iterator. Consider<br>
the following situation: a user creates her own region containing just a<br>
single basic block TheBB, then tries to have the block_iterator to print a<br>
DFS traversal of the region. The expected behavior should be that only the<br>
single basic block TheBB will be printed, but the real behavior is that<br>
block_iterator prints out all the basic blocks of the CFG starting from<br>
TheBB to the end.<br>
<br>
     It looks like the issue originates from setting the end iterator to<br>
(BasicBlock *) 0. I understand that the "region" detected by RegionInfo<br>
should never contain a single basic block or even a sequence of basic<br>
blocks. So maybe the above degenerated case is considered "will never<br>
happen"?<br>
<br>
     ... ...<br>
<br>
     BasicBlock *BB = Func.getARandomBasicBlock;<br>
<br>
     Region *R = new Region(BB, BB, RI, DT);<br>
     for (Region::block_iterator i = R->block_begin(),<br>
            e = R->block_end(); i != e; ++i) {<br>
          errs() << (*i)->getName() << "\n";<br>
       }<br>
</blockquote>
<br>
<br></div></div>
Hi Paul,<br>
<br>
the exit basic block is the block after the region.<br>
<br>
 BB0 < Entering Block<br>
  |<br>
  v<br>
 BB1 < Entry and Exiting block<br>
  |<br>
  v<br>
 BB2 < Exit block<br>
<br>
So your code should probably be:<br>
<br>
new Region(BB, *pred_begin(BB), RI, DT)<br>
<br>
Let me know if it works for you. In case it does, we could add an assert to the constructor to catch these cases.<br>
<br>
Cheers,<br>
Tobias<br>
</blockquote></div><br></div>