This fixes a bug at LibCallSimplifier::optimizeMemChr which does the following transformation:
// memchr("\r\n", C, 2) != nullptr -> (1 << C & ((1 << '\r') | (1 << '\n'))) // != 0 // after bounds check.
As written above, a bounds check on C (whether it is less than integer bitwidth) is done before doing 1 << C otherwise 1 << C will overflow.
If the bounds check is false, the result of (1 << C & ...) must not be used at all, otherwise the result of shift (which is poison) will contaminate the whole results.
A correct way to encode this is select i1 (bounds check), (1 << C & ...), false because select does not allow the unused operand to contaminate the result.
However, this optimization was introducing and (bounds check), (1 << C & ...) which cannot do that.
The bug was found from compilation of this C++ code: https://reviews.llvm.org/rG2fd3037ac615#1007197