Splitting basic blocks while preserving machine code

Hi,

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?

Thanks,

Trevor

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

-Jim

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?

Trevor

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