There are situations where a machine basic block has to be split into two machine basic blocks, e.g., to place a constant pool entry or to fix a conditional branch so that its target is within its range (https://reviews.llvm.org/D38918).
However, it doesn’t appear to be straightforward how the control flow graph should be updated when a machine basic block is split, especially when the split point is between two branches. In this case, in order to determine the successors of each of the two machine basic block, one needs to know the target of each terminator. If we ignore indirect branches whose targets are not known at compile-time, I wonder whether something like the following is viable or not:
fallthrough = true
for each terminator i in machine basic block mbb
if i is control flow barrier and i is not predicable // Is this the correct way to determine whether an instruction may fall through?
fallthrough = false
break // Instructions after the first non-predicable barrier cannot be executed, right?
ignore operands of i if i is a return
for each operand o of i
if o is a machine basic block // Can an instruction other than a jump table instruction target multiple machine basic blocks?
add o to mbb.successors
if o is a jump table index
add all machine basic blocks in the jump table to mbb.successors
if fallthrough == true
add the layout successor to mbb.successors, if one exists
Am I missing something?
Please give me some advice.