Optimization Pass to Split a "Merge" Block

Hi all,

Is there an existing optimization in LLVM that will get split or rid of the “merge” block into the cases of where it’s from.

Evidently doing this for all cases could result in a blowup of code, but perhaps this exists somewhere for more limited cases (for example where the merge block could be eliminated entirely).

Cheers,
Billy Moses

A:

br merge

B:

br merge

merge:
%var = phi [%a, A], [%b, B]
%wherefrom = phi [true, A], [false, B]
br cond %wherefrom A2, B2

A2:

B2:

Are you thinking of Jump Threading? I can’t say for certain whether LLVM’s implementation would handle this exact case, but that’s the pass I’d expect to be applicable here.

Sounds like tail duplication , lib/CodeGen/TailDuplication.cpp