Splitting basic blocks while preserving machine code


I'm writing a pass that does some static analysis on C code. A critical requirement of the pass is that it must preserve not only the correctness of the code but also its timing -- It cannot add or remove even one CPU cycle from the resulting machine code. To put it another way, the binary executable that is produced when the pass is present must be identical to what is produced when the pass is not present.

That said, I have run into a situation where it would help to split certain basic blocks, probably by calling BasicBlock::splitBasicBlock. But this method adds an unconditional branch instruction. Would this new instruction alter the machine code that is later generated, or would the additional branch somehow be optimized away in subsequent passes?



It probably would be optimized away, yes, but I would recommend against counting on it with requirements as strict as yours.


You could always undo the split right before your pass finishes.

How would I undo a split? Perhaps by merging them back using llvm::MergeBlockIntoPredecessor?


Exactly. It's for merging two blocks when there is an unconditional
branch between them.