how to generate select-free LLVM IR?

I run “clang … --emit-llvm …”. I get LLVM IR select instructions out. I don’t want select instructions, but want explicit control flow.

Is there a way to do this?

I’m scared of disabling the SimplifyCFG pass since it appears to do much more than just rewrite to use select statements.

Probably you want to a pass to transform select instructions to control flow late, after optimizations have run. Trying to prevent clang IR generation and IR optimizations from forming selects is way too difficult.

I don’t think this transform exists as an independent pass, but you can borrow code from CodeGenPrepare::optimizeSelectInst.


Hi Robert,

You could write your own LLVM pass that lowers select instructions.

Many static analyzers based on LLVM actually do that. See for instance in IKOS: