1*9880d681SAndroid Build Coastguard Worker; This test makes sure that and instructions are properly eliminated. 2*9880d681SAndroid Build Coastguard Worker; This test is for Integer BitWidth > 64 && BitWidth <= 1024. 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | not grep "and " 5*9880d681SAndroid Build Coastguard Worker; END. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine i999 @test0(i999 %A) { 9*9880d681SAndroid Build Coastguard Worker %B = and i999 %A, 0 ; zero result 10*9880d681SAndroid Build Coastguard Worker ret i999 %B 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine i477 @test1(i477 %A, i477 %B) { 14*9880d681SAndroid Build Coastguard Worker ;; (~A & ~B) == (~(A | B)) - De Morgan's Law 15*9880d681SAndroid Build Coastguard Worker %NotA = xor i477 %A, -1 16*9880d681SAndroid Build Coastguard Worker %NotB = xor i477 %B, -1 17*9880d681SAndroid Build Coastguard Worker %C1 = and i477 %NotA, %NotB 18*9880d681SAndroid Build Coastguard Worker ret i477 %C1 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine i129 @tst(i129 %A, i129 %B) { 22*9880d681SAndroid Build Coastguard Worker ;; (~A & ~B) == (~(A | B)) - De Morgan's Law 23*9880d681SAndroid Build Coastguard Worker %NotA = xor i129 %A, -1 24*9880d681SAndroid Build Coastguard Worker %NotB = xor i129 %B, -1 25*9880d681SAndroid Build Coastguard Worker %C1 = and i129 %NotA, %NotB 26*9880d681SAndroid Build Coastguard Worker ret i129 %C1 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i65 @test(i65 %A, i65 %B) { 30*9880d681SAndroid Build Coastguard Worker ;; (~A & ~B) == (~(A | B)) - De Morgan's Law 31*9880d681SAndroid Build Coastguard Worker %NotA = xor i65 %A, -1 32*9880d681SAndroid Build Coastguard Worker %NotB = xor i65 -1, %B 33*9880d681SAndroid Build Coastguard Worker %C1 = and i65 %NotA, %NotB 34*9880d681SAndroid Build Coastguard Worker ret i65 %C1 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine i66 @tes(i66 %A, i66 %B) { 38*9880d681SAndroid Build Coastguard Worker ;; (~A & ~B) == (~(A | B)) - De Morgan's Law 39*9880d681SAndroid Build Coastguard Worker %NotA = xor i66 %A, -1 40*9880d681SAndroid Build Coastguard Worker %NotB = xor i66 %B, -1 41*9880d681SAndroid Build Coastguard Worker %C1 = and i66 %NotA, %NotB 42*9880d681SAndroid Build Coastguard Worker ret i66 %C1 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine i1005 @test2(i1005 %x) { 46*9880d681SAndroid Build Coastguard Worker %tmp.2 = and i1005 %x, -1 ; noop 47*9880d681SAndroid Build Coastguard Worker ret i1005 %tmp.2 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine i123 @test3(i123 %x) { 51*9880d681SAndroid Build Coastguard Worker %tmp.0 = and i123 %x, 127 52*9880d681SAndroid Build Coastguard Worker %tmp.2 = and i123 %tmp.0, 128 53*9880d681SAndroid Build Coastguard Worker ret i123 %tmp.2 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine i1 @test4(i737 %x) { 57*9880d681SAndroid Build Coastguard Worker %A = and i737 %x, -2147483648 58*9880d681SAndroid Build Coastguard Worker %B = icmp ne i737 %A, 0 59*9880d681SAndroid Build Coastguard Worker ret i1 %B 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine i117 @test5(i117 %A, i117* %P) { 63*9880d681SAndroid Build Coastguard Worker %B = or i117 %A, 3 64*9880d681SAndroid Build Coastguard Worker %C = xor i117 %B, 12 65*9880d681SAndroid Build Coastguard Worker store i117 %C, i117* %P 66*9880d681SAndroid Build Coastguard Worker %r = and i117 %C, 3 67*9880d681SAndroid Build Coastguard Worker ret i117 %r 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdefine i117 @test6(i117 %A, i117 %B) { 71*9880d681SAndroid Build Coastguard Worker ;; ~(~X & Y) --> (X | ~Y) 72*9880d681SAndroid Build Coastguard Worker %t0 = xor i117 %A, -1 73*9880d681SAndroid Build Coastguard Worker %t1 = and i117 %t0, %B 74*9880d681SAndroid Build Coastguard Worker %r = xor i117 %t1, -1 75*9880d681SAndroid Build Coastguard Worker ret i117 %r 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine i1024 @test7(i1024 %A) { 79*9880d681SAndroid Build Coastguard Worker %X = ashr i1024 %A, 1016 ;; sign extend 80*9880d681SAndroid Build Coastguard Worker %C1 = and i1024 %X, 255 81*9880d681SAndroid Build Coastguard Worker ret i1024 %C1 82*9880d681SAndroid Build Coastguard Worker} 83