This extends **foldCastedBitwiseLogic** to handle the similar cases.

I have recently submitted a patch to implement a single fold like:

(A > 0) | (A < 0) -> zext (A != 0)

But it is not general enough, and some problems like a < b & a >= b - 1 happen again.

So I generalize this fold by matching the pattern `bitwise(A >> C - 1, zext(icmp))`, and replace `A >> C - 1` with `zext(A < 0)` here.

(C is the scalar size bits of the type of A)

Then we get `bitwise(zext(A < 0), zext(icmp))`, this will be folded by original code in **foldCastedBitwiseLogic**, into `zext(bitwise(A < 0, icmp))`.

And finally, any related icmp fold will be automatically implemented because `bitwise(icmp,icmp)` had been implemented.

The proof of the correctness is obvious, because the folds below were previously proved and implemented.

`A >> C - 1 -> zext(A < 0)`

`bitwise(zext(A), zext(B)) -> zext(bitwise(A, B))`

And the fold of this patch is the combination of folds above.

Related issue:

a < b | a >b

a < b & a >= b - 1

Related patch:

D154126

Does

Op1need to be anicmp, or can it just be anyi1?