Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
alive/tests/instcombine/andorxor.opt
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
1520 lines (1191 sloc)
22.3 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Name: AndOrXor:135 | |
| %op = xor %X, C1 | |
| %r = and %op, C2 | |
| => | |
| %a = and %X, C2 | |
| %r = xor %a, C1&C2 | |
| Name: AndOrXor:144 | |
| ;Pre: C1&C2 != C1 -- only for profitability | |
| %op = or %X, C1 | |
| %r = and %op, C2 | |
| => | |
| %o = or %X, C1&C2 | |
| %r = and %o, C2 | |
| Name: AndOrXor:151 | |
| Pre: (C1 & C2) == C1 | |
| ; && (C1 & C2) != 0 -- only for profitability | |
| %op = or %X, C1 | |
| %r = and %op, C2 | |
| => | |
| %a = and %X, C2^(C1&C2) | |
| %r = or %a, C1 | |
| Name: AndOrXor:185 | |
| Pre: isPowerOf2(C2) && C1 & (C2-1) == 0 && C2 & C1 == 0 | |
| %op = add %X, C1 | |
| %r = and %op, C2 | |
| => | |
| %r = and %X, C2 | |
| Name: AndOrXor:190 | |
| Pre: isPowerOf2(C2) && C1 & (C2-1) == 0 && C2 & C1 != 0 | |
| %op = add %X, C1 | |
| %r = and %op, C2 | |
| => | |
| %a = and %X, C2 | |
| %r = xor %a, C2 | |
| Name: AndOrXor:206 | |
| Pre: C2 & (-1 << C1) == (-1 << C1) | |
| %op = shl %X, C1 | |
| %r = and %op, C2 | |
| => | |
| %r = %op | |
| Name: AndOrXor:210 | |
| Pre: C2 & (-1 << C1) != (-1 << C1) && C2 & (-1 << C1) != C2 | |
| %op = shl %X, C1 | |
| %r = and %op, C2 | |
| => | |
| %r = and %op, C2 & (-1 << C1) | |
| Name: AndOrXor:226 | |
| Pre: C2 & lshr(-1, C1) == lshr(-1, C1) | |
| %op = lshr %X, C1 | |
| %r = and %op, C2 | |
| => | |
| %r = %op | |
| Name: AndOrXor:230 | |
| Pre: C2 & lshr(-1, C1) != lshr(-1, C1) | |
| ; && C2 & lshr(-1, C1) != C2 -- profitability only | |
| %op = lshr %X, C1 | |
| %r = and %op, C2 | |
| => | |
| %r = and %op, C2 & lshr(-1, C1) | |
| Name: AndOrXor:246 | |
| Pre: hasOneUse(%op) && C2 & lshr(-1, C1) == C2 | |
| %op = ashr %X, C1 | |
| %r = and %op, C2 | |
| => | |
| %op = lshr %X, C1 | |
| %r = and %op, C2 | |
| Name: AndOrXor:270 | |
| Pre: C1 <= C2 && C1 == C2 | |
| %c1 = icmp sge %X, C1 | |
| %c2 = icmp slt %X, C2 | |
| %r = and %c1, %c2 | |
| => | |
| %r = false | |
| Name: AndOrXor:273 | |
| Pre: C1 <= C2 && C1 == 1 << (width(C1)-1) | |
| %c1 = icmp sge %X, C1 | |
| %c2 = icmp slt %X, C2 | |
| %r = and %c1, %c2 | |
| => | |
| %r = icmp slt %X, C2 | |
| Name: AndOrXor:280 | |
| Pre: C1 <= C2 | |
| %c1 = icmp sge %X, C1 | |
| %c2 = icmp slt %X, C2 | |
| %r = and %c1, %c2 | |
| => | |
| %a = add %X, -C1 | |
| %r = icmp ult %a, -C1+C2 | |
| Name: AndOrXor:287 | |
| Pre: C1 <= C2 && C1 == C2 | |
| %c1 = icmp slt %X, C1 | |
| %c2 = icmp sge %X, C2 | |
| %r = or %c1, %c2 | |
| => | |
| %r = true | |
| Name: AndOrXor:290 | |
| Pre: C1 <= C2 && C1 != C2 && C1 == 1<< (width(C1)-1) | |
| %c1 = icmp slt %X, C1 | |
| %c2 = icmp sge %X, C2 | |
| %r = or %c1, %c2 | |
| => | |
| %r = icmp sgt %X, (C2-1) | |
| Name: AndOrXor:298 | |
| Pre: C1 <= C2 && C1 != C2 | |
| %c1 = icmp slt %X, C1 | |
| %c2 = icmp sge %X, C2 | |
| %r = or %c1, %c2 | |
| => | |
| %a = add %X, -C1 | |
| %r = icmp ugt %a, -C1+(C2-1) | |
| Name: AndOrXor:343 | |
| Pre: C1 & C2 == C2 && (isPowerOf2OrZero(C2+1) || (isShiftedMask(C2) && MaskedValueIsZero(%B, (1 << (width(C2) - countLeadingZeros((C2 - 1) ^ C2)))-1))) | |
| %lhs = and %A, C1 | |
| %Op = add %lhs, %B | |
| %r = and %Op, C2 | |
| => | |
| %op = add %A, %B | |
| %r = and %op, C2 | |
| Name: AndOrXor:363 | |
| Pre: isPowerOf2OrZero(C2+1) && C1 & C2 == 0 | |
| %lhs = or %A, C1 | |
| %Op = add %lhs, %B | |
| %r = and %Op, C2 | |
| => | |
| %op = add %A, %B | |
| %r = and %op, C2 | |
| Name: AndOrXor:364 | |
| Pre: isPowerOf2OrZero(C2+1) && C1 & C2 == 0 | |
| %lhs = xor %A, C1 | |
| %Op = sub %lhs, %B | |
| %r = and %Op, C2 | |
| => | |
| %op = sub %A, %B | |
| %r = and %op, C2 | |
| Name: AndOrXor:516 | |
| %r = icmp slt %X, 0 | |
| => | |
| %a = and %X, 1 << (width(%X)-1) | |
| %r = icmp ne %a, 0 | |
| Name: AndOrXor:523 | |
| %r = icmp sgt %X, -1 | |
| => | |
| %a = and %X, 1 << (width(%X)-1) | |
| %r = icmp eq %a, 0 | |
| Name: AndOrXor:530 | |
| Pre: isPowerOf2(C) | |
| %r = icmp ult %X, C | |
| => | |
| %a = and %X, -C | |
| %r = icmp eq %a, 0 | |
| Name: AndOrXor:537 | |
| Pre: isPowerOf2(C+1) | |
| %r = icmp ugt %X, C | |
| => | |
| %a = and %X, ~C | |
| %r = icmp ne %a, 0 | |
| Name: AndOrXor:698 | |
| %a1 = and %a, %b | |
| %a2 = and %a, %d | |
| %op0 = icmp eq %a1, 0 | |
| %op1 = icmp eq %a2, 0 | |
| %r = and %op0, %op1 | |
| => | |
| %or = or %b, %d | |
| %a3 = and %a, %or | |
| %r = icmp eq %a3, 0 | |
| Name: AndOrXor:709 | |
| %a1 = and %a, %b | |
| %a2 = and %a, %d | |
| %op0 = icmp eq %a1, %b | |
| %op1 = icmp eq %a2, %d | |
| %r = and %op0, %op1 | |
| => | |
| %or = or %b, %d | |
| %a3 = and %a, %or | |
| %r = icmp eq %a3, %or | |
| Name: AndOrXor:716 | |
| %a1 = and %a, %b | |
| %a2 = and %a, %d | |
| %op0 = icmp eq %a1, %a | |
| %op1 = icmp eq %a2, %a | |
| %r = and %op0, %op1 | |
| => | |
| %a4 = and %b, %d | |
| %a3 = and %a, %a4 | |
| %r = icmp eq %a3, %a | |
| Name: AndOrXor:732-1 | |
| Pre: C1 & C2 == C1 | |
| %a1 = and %a, C1 | |
| %a2 = and %a, C2 | |
| %op0 = icmp ne %a1, 0 | |
| %op1 = icmp ne %a2, 0 | |
| %r = and %op0, %op1 | |
| => | |
| %r = icmp ne %a1, 0 | |
| Name: AndOrXor:732-2 | |
| Pre: C1 & C2 == C1 | |
| %a1 = and %a, C1 | |
| %a2 = and %a, C2 | |
| %op0 = icmp ne %a1, C1 | |
| %op1 = icmp ne %a2, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = icmp ne %a1, C1 | |
| Name: AndOrXor:745 | |
| Pre: C1 | C2 == C1 | |
| %a1 = and %a, C1 | |
| %a2 = and %a, C2 | |
| %op0 = icmp ne %a1, %a | |
| %op1 = icmp ne %a2, %a | |
| %r = and %op0, %op1 | |
| => | |
| %r = icmp ne %a1, %a | |
| Name: AndOrXor:757 | |
| Pre: (C1 & C3) & (C2 ^ C4) == 0 && C1 & C2 == C2 && C3 & C4 == C4 | |
| %a1 = and %a, C1 | |
| %a2 = and %a, C3 | |
| %op0 = icmp eq %a1, C2 | |
| %op1 = icmp eq %a2, C4 | |
| %r = and %op0, %op1 | |
| => | |
| %a3 = and %a, C1|C3 | |
| %r = icmp eq %a3, C2|C4 | |
| Name: AndOrXor:794 | |
| ; FIXME: missing the remaining cases | |
| %op0 = icmp sgt %a, %b | |
| %op1 = icmp ne %a, %b | |
| %r = and %op0, %op1 | |
| => | |
| %r = icmp sgt %a, %b | |
| Name: AndOrXor:819 | |
| Pre: isPowerOf2(C) | |
| %op0 = icmp ult %a, C | |
| %op1 = icmp ult %b, C | |
| %r = and %op0, %op1 | |
| => | |
| %o = or %a, %b | |
| %r = icmp ult %o, C | |
| Name: AndOrXor:827 | |
| %op0 = icmp eq %a, 0 | |
| %op1 = icmp eq %b, 0 | |
| %r = and %op0, %op1 | |
| => | |
| %o = or %a, %b | |
| %r = icmp eq %o, 0 | |
| Name: AndOrXor:842 | |
| Pre: ((1 << width(C1))-1) & C3 == 0 && ((1 << width(C1))-1) & C2 == 0 | |
| %t = trunc %x to i11 | |
| %op0 = icmp eq %t, C1 | |
| %a1 = and %x, C3 | |
| %op1 = icmp eq %a1, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %a2 = and %x, C3 | ((1 << width(C1))-1) | |
| %r = icmp eq %a2, zext(C1) | C2 | |
| Name: AndOrXor:887-1 | |
| ; FIXME: missing the remaining combinations: [su][lg]t | |
| Pre: C1 != C2 | |
| %op0 = icmp eq %a, C1 | |
| %op1 = icmp eq %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = false | |
| Name: AndOrXor:887-2 | |
| %op0 = icmp eq %a, C1 | |
| %op1 = icmp ne %a, C1 | |
| %r = and %op0, %op1 | |
| => | |
| %r = false | |
| Name: AndOrXor:922 | |
| Pre: C1 u< C2 | |
| %op0 = icmp eq %a, C1 | |
| %op1 = icmp ne %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op0 | |
| Name: AndOrXor:923 | |
| Pre: C1 u< C2 | |
| %op0 = icmp eq %a, C1 | |
| %op1 = icmp ult %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op0 | |
| Name: AndOrXor:924 | |
| Pre: C1 < C2 | |
| %op0 = icmp eq %a, C1 | |
| %op1 = icmp slt %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op0 | |
| Name: AndOrXor:931 | |
| Pre: C1 u< C2 && C1 == C2-1 | |
| %op0 = icmp ne %a, C1 | |
| %op1 = icmp ult %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = icmp ult %a, C1 | |
| Name: AndOrXor:937 | |
| Pre: C1 < C2 && C1 == C2-1 | |
| %op0 = icmp ne %a, C1 | |
| %op1 = icmp slt %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = icmp slt %a, C1 | |
| Name: AndOrXor:940 | |
| Pre: C1 u< C2 | |
| %op0 = icmp ne %a, C1 | |
| %op1 = icmp eq %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op1 | |
| Name: AndOrXor:941 | |
| Pre: C1 u< C2 | |
| %op0 = icmp ne %a, C1 | |
| %op1 = icmp ugt %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op1 | |
| Name: AndOrXor:942 | |
| Pre: C1 < C2 | |
| %op0 = icmp ne %a, C1 | |
| %op1 = icmp sgt %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op1 | |
| Name: AndOrXor:949 | |
| Pre: C1 u< C2 && C1 == C2-1 | |
| %op0 = icmp ne %a, C1 | |
| %op1 = icmp ne %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %s = add %a, -C1 | |
| %r = icmp ugt %s, 1 | |
| Name: AndOrXor:961 | |
| Pre: C1 u< C2 | |
| %op0 = icmp ult %a, C1 | |
| %op1 = icmp eq %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = false | |
| Name: AndOrXor:962 | |
| Pre: C1 u< C2 | |
| %op0 = icmp ult %a, C1 | |
| %op1 = icmp ugt %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = false | |
| Name: AndOrXor:966 | |
| Pre: C1 u< C2 | |
| %op0 = icmp ult %a, C1 | |
| %op1 = icmp ne %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op0 | |
| Name: AndOrXor:967 | |
| Pre: C1 u< C2 | |
| %op0 = icmp ult %a, C1 | |
| %op1 = icmp ult %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op0 | |
| Name: AndOrXor:978 | |
| Pre: C1 < C2 | |
| %op0 = icmp slt %a, C1 | |
| %op1 = icmp ne %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op0 | |
| Name: AndOrXor:979 | |
| Pre: C1 < C2 | |
| %op0 = icmp slt %a, C1 | |
| %op1 = icmp slt %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op0 | |
| Name: AndOrXor:988 | |
| Pre: C1 u< C2 | |
| %op0 = icmp ugt %a, C1 | |
| %op1 = icmp eq %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op1 | |
| Name: AndOrXor:989 | |
| Pre: C1 u< C2 | |
| %op0 = icmp ugt %a, C1 | |
| %op1 = icmp ugt %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op1 | |
| Name: AndOrXor:994 | |
| Pre: C1 u< C2 && C2 == C1+1 | |
| %op0 = icmp ugt %a, C1 | |
| %op1 = icmp ne %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = icmp ugt %a, C2 | |
| Name: AndOrXor:1006 | |
| Pre: C1 < C2 | |
| %op0 = icmp sgt %a, C1 | |
| %op1 = icmp eq %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op1 | |
| Name: AndOrXor:1007 | |
| Pre: C1 < C2 | |
| %op0 = icmp sgt %a, C1 | |
| %op1 = icmp sgt %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = %op1 | |
| Name: AndOrXor:1012 | |
| Pre: C1 < C2 && C2 == C1+1 | |
| %op0 = icmp sgt %a, C1 | |
| %op1 = icmp ne %a, C2 | |
| %r = and %op0, %op1 | |
| => | |
| %r = icmp sgt %a, C2 | |
| Name: AndOrXor:1140-1 | |
| Pre: MaskedValueIsZero(%op0LHS, ~C) | |
| %op0 = xor %op0LHS, %op0RHS | |
| %r = and %op0, C | |
| => | |
| %newRHS = and %op0RHS, C | |
| %r = xor %op0LHS, %newRHS | |
| Name: AndOrXor:1140-2 | |
| Pre: MaskedValueIsZero(%op0LHS, ~C) | |
| %op0 = or %op0LHS, %op0RHS | |
| %r = and %op0, C | |
| => | |
| %newRHS = and %op0RHS, C | |
| %r = or %op0LHS, %newRHS | |
| Name: AndOrXor:1146-1 | |
| Pre: MaskedValueIsZero(%op0RHS, ~C) | |
| %op0 = xor %op0LHS, %op0RHS | |
| %r = and %op0, C | |
| => | |
| %newLHS = and %op0LHS, C | |
| %r = xor %newLHS, %op0RHS | |
| Name: AndOrXor:1146-2 | |
| Pre: MaskedValueIsZero(%op0RHS, ~C) | |
| %op0 = or %op0LHS, %op0RHS | |
| %r = and %op0, C | |
| => | |
| %newLHS = and %op0LHS, C | |
| %r = or %newLHS, %op0RHS | |
| Name: AndOrXor:1175 | |
| Pre: MaskedValueIsZero(%A, lshr(-1, countLeadingZeros(C))) | |
| %lhs = sub %A, %B | |
| %r = and %lhs, C | |
| => | |
| %neg = sub 0, %B | |
| %r = and %neg, C | |
| Name: AndOrXor:1191-1 | |
| %op0 = shl 1, %op0RHS | |
| %r = and %op0, 1 | |
| => | |
| %newICMP = icmp eq %op0RHS, 0 | |
| %r = zext %newICMP | |
| Name: AndOrXor:1191-2 | |
| %op0 = lshr 1, %op0RHS | |
| %r = and %op0, 1 | |
| => | |
| %newICMP = icmp eq %op0RHS, 0 | |
| %r = zext %newICMP | |
| Name: AndOrXor:1207 | |
| %a = and %x, C1 | |
| %op0 = trunc %a | |
| %r = and %op0, C2 | |
| => | |
| %newcast = trunc %x | |
| %r = and %newcast, trunc(C1) & C2 | |
| Name: AndOrXor:1230 ~A & ~B -> ~(A | B) | |
| %op0 = xor %notOp0, -1 | |
| %op1 = xor %notOp1, -1 | |
| %r = and %op0, %op1 | |
| => | |
| %or = or %notOp0, %notOp1 | |
| %r = xor %or, -1 | |
| Name: AndOrXor:1241 (A|B) & ~(A&B) => A^B | |
| %op0 = or %A, %B | |
| %notOp1 = and %A, %B | |
| %op1 = xor %notOp1, -1 | |
| %r = and %op0, %op1 | |
| => | |
| %r = xor %A, %B | |
| Name: AndOrXor:1247 ~(A&B) & (A|B) => A^B | |
| %notOp0 = and %A, %B | |
| %op0 = xor %notOp0, -1 | |
| %op1 = or %A, %B | |
| %r = and %op0, %op1 | |
| => | |
| %r = xor %A, %B | |
| Name: AndOrXor:1253 A & (A^B) -> A & ~B | |
| ; FIXME: need pre: !constant(%A) to avoid infinite loop when A == -1 | |
| %op0 = xor %A, %B | |
| %r = and %op0, %A | |
| => | |
| %notB = xor %B, -1 | |
| %r = and %A, %notB | |
| Name: AndOrXor:1280 (~A|B)&A -> A&B | |
| %nA = xor %A, -1 | |
| %op0 = or %nA, %B | |
| %r = and %op0, %A | |
| => | |
| %r = and %A, %B | |
| Name: AndOrXor:1288 (A ^ B) & ((B ^ C) ^ A) -> (A ^ B) & ~C | |
| %op0 = xor %A, %B | |
| %x = xor %B, %C | |
| %op1 = xor %x, %A | |
| %r = and %op0, %op1 | |
| => | |
| %negC = xor %C, -1 | |
| %r = and %op0, %negC | |
| Name: AndOrXor:1294 (A | B) & ((~A) ^ B) -> (A & B) | |
| %op0 = or %A, %B | |
| %x = xor %A, -1 | |
| %op1 = xor %x, %B | |
| %r = and %op0, %op1 | |
| => | |
| %r = and %A, %B | |
| Name: AndOrXor:1346 (sext) | |
| %op0 = sext %x | |
| %op1 = sext %y | |
| %r = and %op0, %op1 | |
| => | |
| %0 = and %x, %y | |
| %r = sext %0 | |
| Name: AndOrXor:1346 (zext) | |
| %op0 = zext %x | |
| %op1 = zext %y | |
| %r = and %op0, %op1 | |
| => | |
| %0 = and %x, %y | |
| %r = zext %0 | |
| Name: AndOrXor:1346 (trunc) | |
| %op0 = trunc %x | |
| %op1 = trunc %y | |
| %r = and %op0, %op1 | |
| => | |
| %0 = and %x, %y | |
| %r = trunc %0 | |
| Name: AndOrXor:1388 | |
| %op0 = sext i1 %a | |
| %r = and %op0, %b | |
| => | |
| %r = select %a, %b, 0 | |
| Name: AndOrXor:1395 | |
| %nop0 = sext i1 %a | |
| %op0 = xor %nop0, -1 | |
| %r = and %op0, %b | |
| => | |
| %r = select %a, 0, %b | |
| Name: AndOrXor:1574 | |
| %A = sext %Cond | |
| %D = xor %A, -1 | |
| %a1 = and %A, %C | |
| %a2 = and %B, %D | |
| %r = or %a1, %a2 | |
| => | |
| %r = select %Cond, %C, %B | |
| Name: AndOrXor:1577 | |
| %A = sext %Cond | |
| %n = xor %Cond, -1 | |
| %D = sext %n | |
| %a1 = and %A, %C | |
| %a2 = and %B, %D | |
| %r = or %a1, %a2 | |
| => | |
| %r = select %Cond, %C, %B | |
| Name: AndOrXor:1581 | |
| %A = sext %Cond | |
| %B = xor %A, -1 | |
| %a1 = and %A, %C | |
| %a2 = and %B, %D | |
| %r = or %a1, %a2 | |
| => | |
| %r = select %Cond, %C, %D | |
| Name: AndOrXor:1583 | |
| %A = sext %Cond | |
| %n = xor %Cond, -1 | |
| %B = sext %n | |
| %a1 = and %A, %C | |
| %a2 = and %B, %D | |
| %r = or %a1, %a2 | |
| => | |
| %r = select %Cond, %C, %D | |
| Name: AndOrXor:1593 | |
| Pre: isPowerOf2(%K1) && isPowerOf2(%K2) | |
| %a1 = and %A, %K1 | |
| %a2 = and %A, %K2 | |
| %cmp1 = icmp eq %a1, 0 | |
| %cmp2 = icmp eq %a2, 0 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %mask = or %K1, %K2 | |
| %masked = and %A, %mask | |
| %r = icmp ne %masked, %mask | |
| Name: AndOrXor:1628-1 | |
| Pre: C1 u> C3 && C2 u> C3 && isPowerOf2(C1 ^ C2) && isPowerOf2(-C2 ^ -C1) && -C2 ^ -C1 == (C3-C2) ^ (C3-C1) && abs(C1-C2) u> C3 | |
| %a1 = add i29 %A, C1 | |
| %a2 = add %A, C2 | |
| %cmp1 = icmp ult %a1, C3 | |
| %cmp2 = icmp ult %a2, C3 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %newand = and %A, ~(C1^C2) | |
| %newadd = add %newand, umax(C1, C2) | |
| %r = icmp ult %newadd, C3 | |
| Name: AndOrXor:1628-2 | |
| Pre: C1 u> C3 && C2 u> C3 && isPowerOf2(C1 ^ C2) && isPowerOf2(-C2 ^ -C1) && -C2 ^ -C1 == (C3-C2) ^ (C3-C1) && abs(C1-C2) u> C3 | |
| %a1 = add i29 %A, C1 | |
| %a2 = add %A, C2 | |
| %cmp1 = icmp ule %a1, C3 | |
| %cmp2 = icmp ule %a2, C3 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %newand = and %A, ~(C1^C2) | |
| %newadd = add %newand, umax(C1, C2) | |
| %r = icmp ule %newadd, C3 | |
| Name: AndOrXor:1683-1 | |
| ; FIXME: parameterize over other icmp | |
| %op0 = icmp ugt %a, %b | |
| %op1 = icmp eq %a, %b | |
| %r = or %op0, %op1 | |
| => | |
| %r = icmp uge %a, %b | |
| Name: AndOrXor:1683-2 | |
| %op0 = icmp uge %a, %b | |
| %op1 = icmp ne %a, %b | |
| %r = or %op0, %op1 | |
| => | |
| %r = true | |
| Name: AndOrXor:1704 | |
| %cmp1 = icmp eq %B, 0 | |
| %cmp2 = icmp ult %A, %B | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %b1 = add %B, -1 | |
| %r = icmp uge %b1, %A | |
| Name: AndOrXor:1705 | |
| %cmp1 = icmp eq %B, 0 | |
| %cmp2 = icmp ugt %B, %A | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %b1 = add %B, -1 | |
| %r = icmp uge %b1, %A | |
| Name: AndOrXor:1733 | |
| %cmp1 = icmp ne %A, 0 | |
| %cmp2 = icmp ne %B, 0 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %or = or %A, %B | |
| %r = icmp ne %or, 0 | |
| Name: AndOrXor:1740 | |
| Pre: C2+C3 == C1 | |
| %add = add %X, C3 | |
| %cmp1 = icmp ult %add, C1 | |
| %cmp2 = icmp eq %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = icmp ule %add, C1 | |
| Name: AndOrXor:1795 | |
| Pre: C1 u< C2 && isPowerOf2(C1 ^ C2) | |
| %cmp1 = icmp eq %X, C1 | |
| %cmp2 = icmp eq %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %a = and %X, ~(C1 ^ C2) | |
| %r = icmp eq %a, C1 | |
| Name: AndOrXor:1806 | |
| Pre: C1 == C2-1 | |
| %cmp1 = icmp eq %X, C1 | |
| %cmp2 = icmp eq %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %a = add %X, -C1 | |
| %r = icmp ult %a, 2 | |
| Name: AndOrXor:1818 | |
| Pre: C1 u< C2 | |
| %cmp1 = icmp eq %X, C1 | |
| %cmp2 = icmp ne %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp2 | |
| Name: AndOrXor:1819 | |
| Pre: C1 u< C2 | |
| %cmp1 = icmp eq %X, C1 | |
| %cmp2 = icmp ult %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp2 | |
| Name: AndOrXor:1820 | |
| Pre: C1 < C2 | |
| %cmp1 = icmp eq %X, C1 | |
| %cmp2 = icmp slt %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp2 | |
| Name: AndOrXor:1827 | |
| Pre: C1 u< C2 | |
| %cmp1 = icmp ne %X, C1 | |
| %cmp2 = icmp eq %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp1 | |
| Name: AndOrXor:1828 | |
| Pre: C1 u< C2 | |
| %cmp1 = icmp ne %X, C1 | |
| %cmp2 = icmp ugt %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp1 | |
| Name: AndOrXor:1829 | |
| Pre: C1 < C2 | |
| %cmp1 = icmp ne %X, C1 | |
| %cmp2 = icmp sgt %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp1 | |
| Name: AndOrXor:1831 | |
| Pre: C1 u< C2 | |
| %cmp1 = icmp ne %X, C1 | |
| %cmp2 = icmp ne %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = true | |
| Name: AndOrXor:1832 | |
| Pre: C1 u< C2 | |
| %cmp1 = icmp ne %X, C1 | |
| %cmp2 = icmp ult %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = true | |
| Name: AndOrXor:1833 | |
| Pre: C1 < C2 | |
| %cmp1 = icmp ne %X, C1 | |
| %cmp2 = icmp slt %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = true | |
| Name: AndOrXor:1844 | |
| Pre: C1 u< C2 && C2 == -1 | |
| %cmp1 = icmp ult %X, C1 | |
| %cmp2 = icmp ugt %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp1 | |
| Name: AndOrXor:1849 | |
| Pre: C1 u< C2 | |
| %cmp1 = icmp ult %X, C1 | |
| %cmp2 = icmp ne %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp2 | |
| Name: AndOrXor:1850 | |
| Pre: C1 u< C2 | |
| %cmp1 = icmp ult %X, C1 | |
| %cmp2 = icmp ult %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp2 | |
| Name: AndOrXor:1864 | |
| Pre: C1 < C2 && C2 == 1 << (width(C2)-1) | |
| %cmp1 = icmp slt %X, C1 | |
| %cmp2 = icmp sgt %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp1 | |
| Name: AndOrXor:1869 | |
| Pre: C1 < C2 | |
| %cmp1 = icmp slt %X, C1 | |
| %cmp2 = icmp ne %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp2 | |
| Name: AndOrXor:1870 | |
| Pre: C1 < C2 | |
| %cmp1 = icmp slt %X, C1 | |
| %cmp2 = icmp slt %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp2 | |
| Name: AndOrXor:1879 | |
| Pre: C1 u< C2 | |
| %cmp1 = icmp ugt %X, C1 | |
| %cmp2 = icmp eq %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp1 | |
| Name: AndOrXor:1880 | |
| Pre: C1 u< C2 | |
| %cmp1 = icmp ugt %X, C1 | |
| %cmp2 = icmp ugt %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp1 | |
| Name: AndOrXor:1884 | |
| Pre: C1 u< C2 | |
| %cmp1 = icmp ugt %X, C1 | |
| %cmp2 = icmp ne %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = true | |
| Name: AndOrXor:1885 | |
| Pre: C1 u< C2 | |
| %cmp1 = icmp ugt %X, C1 | |
| %cmp2 = icmp ult %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = true | |
| Name: AndOrXor:1894 | |
| Pre: C1 < C2 | |
| %cmp1 = icmp sgt %X, C1 | |
| %cmp2 = icmp eq %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp1 | |
| Name: AndOrXor:1895 | |
| Pre: C1 < C2 | |
| %cmp1 = icmp sgt %X, C1 | |
| %cmp2 = icmp sgt %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = %cmp1 | |
| Name: AndOrXor:1899 | |
| Pre: C1 < C2 | |
| %cmp1 = icmp sgt %X, C1 | |
| %cmp2 = icmp ne %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = true | |
| Name: AndOrXor:1900 | |
| Pre: C1 < C2 | |
| %cmp1 = icmp sgt %X, C1 | |
| %cmp2 = icmp slt %X, C2 | |
| %r = or %cmp1, %cmp2 | |
| => | |
| %r = true | |
| Name: AndOrXor:1979 | |
| Pre: C1 ^ C2 == -1 | |
| %or = or %A, %B | |
| %op0 = and %or, C1 | |
| %op1 = and %B, C2 | |
| %r = or %op0, %op1 | |
| => | |
| %a = and %A, C1 | |
| %r = or %a, %B | |
| Name: AndOrXor:2008 | |
| Pre: C1 ^ C2 == -1 | |
| %or = xor %A, %B | |
| %op0 = and %or, C1 | |
| %op1 = and %B, C2 | |
| %r = or %op0, %op1 | |
| => | |
| %a = and %A, C1 | |
| %r = xor %a, %B | |
| Name: AndOrXor:2052 (X & C1) | C2 --> (X | C2) & (C1|C2) | |
| Pre: C & C1 != 0 ; @@ why? it's just as correct without | |
| %op0 = and %x, C1 | |
| %r = or %op0, C | |
| => | |
| %or = or %x, C | |
| %r = and %or, (C | C1) | |
| Name: AndOrXor:2063 (X ^ C1) | C2 --> (X | C2) ^ (C1 & ~C2) | |
| %op0 = xor %x, C1 | |
| %r = or %op0, C | |
| => | |
| %or = or %x, C | |
| %r = xor %or, (C1 & ~C) | |
| Name: AndOrXor:2095 (X^C)|Y -> (X|Y)^C iff Y&C == 0 | |
| Pre: MaskedValueIsZero(%op1, C1) | |
| %op0 = xor %A, C1 | |
| %r = or %op0, %op1 | |
| => | |
| %or = or %A, %op1 | |
| %r = xor %or, C1 | |
| Name: AndOrXor:2113 ((~A & B) | A) -> (A | B) | |
| %negA = xor %A, -1 | |
| %op0 = and %negA, %B | |
| %r = or %op0, %A | |
| => | |
| %r = or %A, %B | |
| Name: AndOrXor:2118 ((A & B) | ~A) -> (~A | B) | |
| %negA = xor %A, -1 | |
| %op0 = and %A, %B | |
| %r = or %op0, %negA | |
| => | |
| %r = or %negA, %B | |
| Name: AndOrXor:2123 (A & (~B)) | (A ^ B) -> (A ^ B) | |
| %negB = xor %B, -1 | |
| %op0 = and %A, %negB | |
| %op1 = xor %A, %B | |
| %r = or %op0, %op1 | |
| => | |
| %r = xor %A, %B | |
| Name: AndOrXor:2142 | |
| Pre: C1 & C2 == 0 && MaskedValueIsZero(%V2, ~C1) | |
| %A = or %B, %V2 | |
| %op0 = and %A, C1 | |
| %op1 = and %B, C2 | |
| %r = or %op0, %op1 | |
| => | |
| %r = and %A, (C1 | C2) | |
| Name: AndOrXor:2160 | |
| Pre: C1 & C2 == 0 && C3 & ~C1 == 0 && C4 & ~C2 == 0 | |
| %A = or %V1, C3 | |
| %B = or %V1, C4 | |
| %op0 = and %A, C1 | |
| %op1 = and %B, C2 | |
| %r = or %op0, %op1 | |
| => | |
| %V2 = or %V1, (C3 | C4) | |
| %r = and %V2, (C1 | C2) | |
| Name: AndOrXor:2188 | |
| %C = xor %D, -1 | |
| %B = xor %A, -1 | |
| %op0 = and %A, %C | |
| %op1 = and %B, %D | |
| %r = or %op0, %op1 | |
| => | |
| %r = xor %A, %D | |
| Name: AndOrXor:2231 (A ^ B) | ((B ^ C) ^ A) -> (A ^ B) | C | |
| %op0 = xor %A, %B | |
| %x = xor %B, %C | |
| %op1 = xor %x, %A | |
| %r = or %op0, %op1 | |
| => | |
| %r = or %op0, %C | |
| Name: AndOrXor:2243 ((B | C) & A) | B -> B | (A & C) | |
| %o = or %B, %C | |
| %op0 = and %o, %A | |
| %r = or %op0, %B | |
| => | |
| %a = and %A, %C | |
| %r = or %B, %a | |
| Name: AndOrXor:2247 (~A | ~B) == (~(A & B)) | |
| %na = xor %A, -1 | |
| %nb = xor %B, -1 | |
| %r = or %na, %nb | |
| => | |
| %a = and %A, %B | |
| %r = xor %a, -1 | |
| Name: AndOrXor:2263 | |
| %op1 = xor %op0, %B | |
| %r = or %op0, %op1 | |
| => | |
| %r = or %op0, %B | |
| Name: AndOrXor:2264 | |
| %na = xor %A, -1 | |
| %op1 = xor %na, %B | |
| %r = or %A, %op1 | |
| => | |
| %nb = xor %B, -1 | |
| %r = or %A, %nb | |
| Name: AndOrXor:2265 | |
| %op0 = and %A, %B | |
| %op1 = xor %A, %B | |
| %r = or %op0, %op1 | |
| => | |
| %r = or %A, %B | |
| Name: AndOrXor:2284 | |
| %o = or %A, %B | |
| %op1 = xor %o, -1 | |
| %r = or %A, %op1 | |
| => | |
| %not = xor %B, -1 | |
| %r = or %A, %not | |
| Name: AndOrXor:2285 | |
| %o = xor %A, %B | |
| %op1 = xor %o, -1 | |
| %r = or %A, %op1 | |
| => | |
| %not = xor %B, -1 | |
| %r = or %A, %not | |
| Name: AndOrXor:2297 | |
| %op0 = and %A, %B | |
| %na = xor %A, -1 | |
| %op1 = xor %na, %B | |
| %r = or %op0, %op1 | |
| => | |
| %r = xor %na, %B | |
| Name: AndOrXor:2321-1 | |
| ; FIXME: generic over casts | |
| %op0 = zext %A | |
| %op1 = zext %B | |
| %r = or %op0, %op1 | |
| => | |
| %or = or %A, %B | |
| %r = zext %or | |
| Name: AndOrXor:2321-2 | |
| %op0 = sext %A | |
| %op1 = sext %B | |
| %r = or %op0, %op1 | |
| => | |
| %or = or %A, %B | |
| %r = sext %or | |
| Name: AndOrXor:2321-3 | |
| %op0 = trunc %A | |
| %op1 = trunc %B | |
| %r = or %op0, %op1 | |
| => | |
| %or = or %A, %B | |
| %r = trunc %or | |
| Name: AndOrXor:2356 | |
| %op0 = sext i1 %A | |
| %r = or %op0, %op1 | |
| => | |
| %r = select %A, -1, %op1 | |
| Name: AndOrXor:2367 | |
| %op0 = or %A, C1 | |
| %r = or %op0, %op1 | |
| => | |
| %i = or %A, %op1 | |
| %r = or %i, C1 | |
| Name: AndOrXor:2375 | |
| %op0 = select %x, %A, %B | |
| %op1 = select %x, %C, %D | |
| %r = or %op0, %op1 | |
| => | |
| %t = or %A, %C | |
| %f = or %B, %D | |
| %r = select %x, %t, %f | |
| Name: AndOrXor:2416 | |
| %x = xor %nx, -1 | |
| %op0 = and %x, %y | |
| %r = xor %op0, -1 | |
| => | |
| %ny = xor %y, -1 | |
| %r = or %nx, %ny | |
| Name: AndOrXor:2417 | |
| %x = xor %nx, -1 | |
| %op0 = or %x, %y | |
| %r = xor %op0, -1 | |
| => | |
| %ny = xor %y, -1 | |
| %r = and %nx, %ny | |
| Name: AndOrXor:2429 | |
| %op0 = and %x, %y | |
| %r = xor %op0, -1 | |
| => | |
| %nx = xor %x, -1 | |
| %ny = xor %y, -1 | |
| %r = or %nx, %ny | |
| Name: AndOrXor:2430 | |
| %op0 = or %x, %y | |
| %r = xor %op0, -1 | |
| => | |
| %nx = xor %x, -1 | |
| %ny = xor %y, -1 | |
| %r = and %nx, %ny | |
| Name: AndOrXor:2443 | |
| %nx = xor %x, -1 | |
| %op0 = ashr %nx, %y | |
| %r = xor %op0, -1 | |
| => | |
| %r = ashr %x, %y | |
| Name: AndOrXor:2453 | |
| ; FIXME: generic over icmp operators; need getInversePredicate | |
| %op0 = icmp slt %x, %y | |
| %r = xor %op0, -1 | |
| => | |
| %r = icmp sge %x, %y | |
| Name: AndOrXor:2459-1 | |
| ; FIXME: generic over icmp operators; need getInversePredicate | |
| %cmp = icmp slt %x, %y | |
| %op0 = zext %cmp to i11 | |
| %r = xor %op0, 1 | |
| => | |
| %ncmp = icmp sge %x, %y | |
| %r = zext %ncmp | |
| Name: AndOrXor:2459-2 | |
| %cmp = icmp slt %x, %y | |
| %op0 = sext %cmp to i11 | |
| %r = xor %op0, -1 | |
| => | |
| %ncmp = icmp sge %x, %y | |
| %r = sext %ncmp | |
| Name: AndOrXor:2475 | |
| %op0 = sub C, %x | |
| %r = xor %op0, -1 | |
| => | |
| %r = add %x, -1-C ; LLVM has -C-1, which prevents testing i1 | |
| Name: AndOrXor:2486 | |
| %op0 = add %x, C | |
| %r = xor %op0, -1 | |
| => | |
| %r = sub -1-C, %x | |
| Name: AndOrXor:2494 | |
| Pre: isSignBit(C1) | |
| %op0 = add %x, C | |
| %r = xor %op0, C1 | |
| => | |
| %r = add %x, C + C1 | |
| Name: AndOrXor:2500 | |
| Pre: MaskedValueIsZero(%x,C1) | |
| %op0 = or %x, C1 | |
| %r = xor %op0, C2 | |
| => | |
| %r = xor %x, C1^C2 | |
| Name: AndOrXor:2515 ((X^C1) >> C2)^C3 -> (X>>C2) ^ ((C1>>C2)^C3) | |
| %e1 = xor %x, C1 | |
| %op0 = lshr %e1, C2 | |
| %r = xor %op0, C3 | |
| => | |
| %0 = lshr %x, C2 | |
| %r = xor %0, lshr(C1,C2)^C3 | |
| Name: AndOrXor:2581 (B|A)^B -> A & ~B | |
| %op0 = or %a, %op1 | |
| %r = xor %op0, %op1 | |
| => | |
| %nop1 = xor %op1, -1 | |
| %r = and %a, %nop1 | |
| Name: AndOrXor:2587 (B&A)^A -> ~B & A | |
| %op0 = and %a, %op1 | |
| %r = xor %op0, %op1 | |
| => | |
| %na = xor %a, -1 | |
| %r = and %na, %op1 | |
| Name: AndOrXor:2595 | |
| %op0 = and %a, %b | |
| %op1 = or %a, %b | |
| %r = xor %op0, %op1 | |
| => | |
| %r = xor %a, %b | |
| Name: AndOrXor:2607 | |
| %na = xor %a, -1 | |
| %nb = xor %b, -1 | |
| %op0 = or %a, %nb | |
| %op1 = or %na, %b | |
| %r = xor %op0, %op1 | |
| => | |
| %r = xor %a, %b | |
| Name: AndOrXor:2617 | |
| %na = xor %a, -1 | |
| %nb = xor %b, -1 | |
| %op0 = and %a, %nb | |
| %op1 = and %na, %b | |
| %r = xor %op0, %op1 | |
| => | |
| %r = xor %a, %b | |
| Name: AndOrXor:2627 | |
| %op0 = xor %a, %c | |
| %op1 = or %a, %b | |
| %r = xor %op0, %op1 | |
| => | |
| %na = xor %a, -1 | |
| %and = and %na, %b | |
| %r = xor %and, %c | |
| Name: AndOrXor:2647 | |
| %op0 = and %a, %b | |
| %op1 = xor %a, %b | |
| %r = xor %op0, %op1 | |
| => | |
| %r = or %a, %b | |
| Name: AndOrXor:2658 | |
| %nb = xor %b, -1 | |
| %op0 = and %a, %nb | |
| %na = xor %a, -1 | |
| %r = xor %op0, %na | |
| => | |
| %and = and %a, %b | |
| %r = xor %and, -1 | |
| Name: AndOrXor:2663 | |
| ; FIXME: parameterize over other icmp | |
| %op0 = icmp ule %a, %b | |
| %op1 = icmp ne %a, %b | |
| %r = xor %op0, %op1 | |
| => | |
| %r = icmp uge %a, %b | |
| Name: AndOrXor:2681-1 | |
| ; FIXME: over all casts | |
| %op0 = zext %a | |
| %op1 = zext %b | |
| %r = xor %op0, %op1 | |
| => | |
| %0 = xor %a, %b | |
| %r = zext %0 | |
| Name: AndOrXor:2681-2 | |
| %op0 = sext %a | |
| %op1 = sext %b | |
| %r = xor %op0, %op1 | |
| => | |
| %0 = xor %a, %b | |
| %r = sext %0 | |
| Name: AndOrXor:2681-3 | |
| %op0 = trunc %a | |
| %op1 = trunc %b | |
| %r = xor %op0, %op1 | |
| => | |
| %0 = xor %a, %b | |
| %r = trunc %0 |