[llvm-dev] question on analyzeBranch and getFallThrough

Bagel via llvm-dev llvm-dev at lists.llvm.org
Fri Jul 17 09:25:19 PDT 2020


Are you sure that if analyzeBranch returns true (i dunno) the block following 
(in layout) will never get moved.  I have the case where:
   bb0: JT    - jump table instruction which can fall through
   bb1:       - the fall through block that JT may fall through
   bb2:       - some block that JT may branch to
And a later pass reorders the blocks:
   bb0:
   bb2:
   bb1:
perhaps because in bb0's successors, bb2 had a higher probability that bb1.

How can I ensure that bb1 always follows bb0 in layout?

Thanks,
brian

On 7/11/20 8:16 PM, James Y Knight wrote:
> 
> 
> On Thu, Jul 9, 2020 at 5:32 PM Bagel via llvm-dev <llvm-dev at lists.llvm.org 
> <mailto:llvm-dev at lists.llvm.org>> wrote:
> 
>     I am working on a back end for an architecture whose jump via table instruction
>     includes the range check. If the index is out of range, the jump table
>     instruction just falls through.  I implemented a pass to remove the range
>     check
>     generated before the jump table instruction because it is superfluous.
>     This causes as assertion in MachineBlockPlacement.cpp:
>             assert((!TII->analyzeBranch(*PrevBB, TBB, FBB, Cond) ||
>                     !PrevBB->canFallThrough()) &&
>                    "Unexpected block with un-analyzable fallthrough!");
> 
> 
> 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.
> 
>     The method MachineBasicBlock::getFallThrough() uses TII->analyzeBranch().
> 
>     Using analyze branch there doesn't appear to be anyway to signify that a
>     branch
>     is not a simple conditional or a simple indirect but rather a combination of
>     the two -- it conditionally branches indirect or falls through.
> 
> 
> 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.
> 
>     Is there a way to express this with analyzeBranch?
> 
>     Can I override the method getFallThough?
> 
>     Is there a way to annotate a basic block to indicate in can fall through?
>     It would seem this would save a lot of calls to analyzeBranck
> 
> 
> I'm working on a change to do this, but that's independent to your issue.
> 



More information about the llvm-dev mailing list