Add assume intrinsic

Adds an `assume` intrinsic that gets translated to llvm.assume. It is
used on a boolean expression and allows the optimizer to assume that
the expression is true.

This implements #18051.
It would be nice to point out that the optimizer will try to preserve the information, so it may hurt performance rather than improving it if not used carefully.