This adds two conjugated folds:
- A | B -> B if A implies B (https://alive2.llvm.org/ce/z/R6GU4j)
- A & B -> A if A implies B (https://alive2.llvm.org/ce/z/EGMqyy)
If A and B are icmps themselves, we will usually fold this through other logic already (though the tests show a couple additional cases we previously missed). However, isImpliedCond() also supports A being of the form X & Y, which allows us to handle cases like (X & Y) | B where X implies B. This addresses the regression from D125398.
Something that notably doesn't work yet is the (X | Y) & B case. This is due to an asymmetry in the isImpliedCondition() implementation that will have to be addressed separately.
nit: might be good to have // A&B -> B where B implies A?
Not sure about the comments using A/B while the code using Op0/Op1. Might be good to keep things consistent, but A/B` seems nicer