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 % 8 != 0. 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 Workerdefine i39 @test0(i39 %A) { 8*9880d681SAndroid Build Coastguard Worker %B = and i39 %A, 0 ; zero result 9*9880d681SAndroid Build Coastguard Worker ret i39 %B 10*9880d681SAndroid Build Coastguard Worker} 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine i47 @test1(i47 %A, i47 %B) { 13*9880d681SAndroid Build Coastguard Worker ;; (~A & ~B) == (~(A | B)) - De Morgan's Law 14*9880d681SAndroid Build Coastguard Worker %NotA = xor i47 %A, -1 15*9880d681SAndroid Build Coastguard Worker %NotB = xor i47 %B, -1 16*9880d681SAndroid Build Coastguard Worker %C1 = and i47 %NotA, %NotB 17*9880d681SAndroid Build Coastguard Worker ret i47 %C1 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine i15 @test2(i15 %x) { 21*9880d681SAndroid Build Coastguard Worker %tmp.2 = and i15 %x, -1 ; noop 22*9880d681SAndroid Build Coastguard Worker ret i15 %tmp.2 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine i23 @test3(i23 %x) { 26*9880d681SAndroid Build Coastguard Worker %tmp.0 = and i23 %x, 127 27*9880d681SAndroid Build Coastguard Worker %tmp.2 = and i23 %tmp.0, 128 28*9880d681SAndroid Build Coastguard Worker ret i23 %tmp.2 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine i1 @test4(i37 %x) { 32*9880d681SAndroid Build Coastguard Worker %A = and i37 %x, -2147483648 33*9880d681SAndroid Build Coastguard Worker %B = icmp ne i37 %A, 0 34*9880d681SAndroid Build Coastguard Worker ret i1 %B 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine i7 @test5(i7 %A, i7* %P) { 38*9880d681SAndroid Build Coastguard Worker %B = or i7 %A, 3 39*9880d681SAndroid Build Coastguard Worker %C = xor i7 %B, 12 40*9880d681SAndroid Build Coastguard Worker store i7 %C, i7* %P 41*9880d681SAndroid Build Coastguard Worker %r = and i7 %C, 3 42*9880d681SAndroid Build Coastguard Worker ret i7 %r 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine i7 @test6(i7 %A, i7 %B) { 46*9880d681SAndroid Build Coastguard Worker ;; ~(~X & Y) --> (X | ~Y) 47*9880d681SAndroid Build Coastguard Worker %t0 = xor i7 %A, -1 48*9880d681SAndroid Build Coastguard Worker %t1 = and i7 %t0, %B 49*9880d681SAndroid Build Coastguard Worker %r = xor i7 %t1, -1 50*9880d681SAndroid Build Coastguard Worker ret i7 %r 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine i47 @test7(i47 %A) { 54*9880d681SAndroid Build Coastguard Worker %X = ashr i47 %A, 39 ;; sign extend 55*9880d681SAndroid Build Coastguard Worker %C1 = and i47 %X, 255 56*9880d681SAndroid Build Coastguard Worker ret i47 %C1 57*9880d681SAndroid Build Coastguard Worker} 58