and.ll revision b80e3ada7b15ae299dabe21bef0f06adbf0eb077
1; This test makes sure that these instructions are properly eliminated. 2; 3 4; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep and 5 6implementation 7 8int %test1(int %A) { 9 %B = and int %A, 0 ; zero result 10 ret int %B 11} 12 13int %test2(int %A) { 14 %B = and int %A, -1 ; noop 15 ret int %B 16} 17 18bool %test3(bool %A) { 19 %B = and bool %A, false ; always = false 20 ret bool %B 21} 22 23bool %test4(bool %A) { 24 %B = and bool %A, true ; noop 25 ret bool %B 26} 27 28int %test5(int %A) { 29 %B = and int %A, %A 30 ret int %B 31} 32 33bool %test6(bool %A) { 34 %B = and bool %A, %A 35 ret bool %B 36} 37 38int %test7(int %A) { ; A & ~A == 0 39 %NotA = xor int %A, -1 40 %B = and int %A, %NotA 41 ret int %B 42} 43 44ubyte %test8(ubyte %A) { ; AND associates 45 %B = and ubyte %A, 3 46 %C = and ubyte %B, 4 47 ret ubyte %C 48} 49 50bool %test9(int %A) { 51 %B = and int %A, -2147483648 ; Test of sign bit, convert to setle %A, 0 52 %C = setne int %B, 0 53 ret bool %C 54} 55 56bool %test9(uint %A) { 57 %B = and uint %A, 2147483648 ; Test of sign bit, convert to setle %A, 0 58 %C = setne uint %B, 0 59 ret bool %C 60} 61 62uint %test10(uint %A) { 63 %B = and uint %A, 12 64 %C = xor uint %B, 15 65 %D = and uint %C, 1 ; (X ^ C1) & C2 --> (X & C2) ^ (C1&C2) 66 ret uint %D 67} 68 69uint %test11(uint %A, uint* %P) { 70 %B = or uint %A, 3 71 %C = xor uint %B, 12 72 store uint %C, uint* %P ; additional use of C 73 %D = and uint %C, 3 ; %C = and uint %B, 3 --> 3 74 ret uint %D 75} 76 77bool %test12(uint %A, uint %B) { 78 %C1 = setlt uint %A, %B 79 %C2 = setle uint %A, %B 80 %D = and bool %C1, %C2 ; (A < B) & (A <= B) === (A < B) 81 ret bool %D 82} 83 84bool %test13(uint %A, uint %B) { 85 %C1 = setlt uint %A, %B 86 %C2 = setgt uint %A, %B 87 %D = and bool %C1, %C2 ; (A < B) & (A > B) === false 88 ret bool %D 89} 90 91bool %test14(ubyte %A) { 92 %B = and ubyte %A, 128 93 %C = setne ubyte %B, 0 94 ret bool %C 95} 96 97ubyte %test15(ubyte %A) { 98 %B = shr ubyte %A, ubyte 7 99 %C = and ubyte %B, 2 ; Always equals zero 100 ret ubyte %C 101} 102 103ubyte %test16(ubyte %A) { 104 %B = shl ubyte %A, ubyte 2 105 %C = and ubyte %B, 3 106 ret ubyte %C 107} 108 109sbyte %test17(sbyte %X, sbyte %Y) { ;; ~(~X & Y) --> (X | ~Y) 110 %B = xor sbyte %X, -1 111 %C = and sbyte %B, %Y 112 %D = xor sbyte %C, -1 113 ret sbyte %D 114} 115 116