This patch folds (select setcc, setcc, setcc) into and/or instructions when truev/falsev is equal to or the inverse of condv.
(select x, x, y) -> x | y https://alive2.llvm.org/ce/z/36Ud3Z
(select !x, x, y) -> x & y https://alive2.llvm.org/ce/z/mYYoGF
(select x, y, x) -> x & y https://alive2.llvm.org/ce/z/MAZ--X
(select !x, y, x) -> x | y https://alive2.llvm.org/ce/z/ct7By5
It is the follow-up improvement of D150177, which optimizes the code of signed truncation check patterns without Zbb.
Can we return std::optional<bool> similar to isImpliedCondition from lib/Analysis/ValueTracking. I think this is very similar to that.