<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jul 9, 2020 at 5:32 PM Bagel via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I am working on a back end for an architecture whose jump via table instruction<br>
includes the range check. If the index is out of range, the jump table <br>
instruction just falls through.  I implemented a pass to remove the range check <br>
generated before the jump table instruction because it is superfluous.<br>
This causes as assertion in MachineBlockPlacement.cpp:<br>
       assert((!TII->analyzeBranch(*PrevBB, TBB, FBB, Cond) ||<br>
               !PrevBB->canFallThrough()) &&<br>
              "Unexpected block with un-analyzable fallthrough!");</blockquote><div><br></div><div>This should not be possible, because blocks which might fall-through and where analyzeBranch said "i dunno" were placed into the BlocksWithUnanalyzableExits set, checked right before that assert.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">The method MachineBasicBlock::getFallThrough() uses TII->analyzeBranch().</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Using analyze branch there doesn't appear to be anyway to signify that a branch <br>
is not a simple conditional or a simple indirect but rather a combination of <br>
the two -- it conditionally branches indirect or falls through.<br></blockquote><div><br></div><div>analyzeBranch should be returning "I dunno" (aka true) for this block, in which case getFallThrough should indicate that the block might fall through. The only other reason getFallThrough wouldn't return a block, is if your block successors are incorrect, or if the last instruction in the block (maybe your jump table instruction) is incorrectly marked as "isBarrier = 1", despite being able to continue.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Is there a way to express this with analyzeBranch?<br>
<br>
Can I override the method getFallThough?<br>
<br>
Is there a way to annotate a basic block to indicate in can fall through?<br>
It would seem this would save a lot of calls to analyzeBranck</blockquote><div><br></div><div>I'm working on a change to do this, but that's independent to your issue.</div><div><br></div></div></div>