1*9880d681SAndroid Build Coastguard Worker; This test makes sure that these instructions are properly eliminated. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | \ 4*9880d681SAndroid Build Coastguard Worker; RUN: not grep "tobool" 5*9880d681SAndroid Build Coastguard Worker; END. 6*9880d681SAndroid Build Coastguard Workerdefine i32 @main(i32 %argc, i8** %argv) nounwind ssp { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 1 ; <i32> [#uses=1] 9*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %and, 0 ; <i1> [#uses=1] 10*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 2 ; <i32> [#uses=1] 11*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp ne i32 %and2, 0 ; <i1> [#uses=1] 12*9880d681SAndroid Build Coastguard Worker %or.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 13*9880d681SAndroid Build Coastguard Worker %retval.0 = select i1 %or.cond, i32 2, i32 1 ; <i32> [#uses=1] 14*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine i32 @main2(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { 18*9880d681SAndroid Build Coastguard Workerentry: 19*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 1 ; <i32> [#uses=1] 20*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and, 0 ; <i1> [#uses=1] 21*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 2 ; <i32> [#uses=1] 22*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, 0 ; <i1> [#uses=1] 23*9880d681SAndroid Build Coastguard Worker %or.cond = or i1 %tobool, %tobool3 ; <i1> [#uses=1] 24*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %or.cond, i32 0, i32 1 ; <i32> [#uses=1] 25*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; tests to check combining (icmp eq (A & B), C) & (icmp eq (A & D), E) 29*9880d681SAndroid Build Coastguard Worker; tests to check if (icmp eq (A & B), 0) is treated like (icmp eq (A & B), B) 30*9880d681SAndroid Build Coastguard Worker; if B is a single bit constant 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; (icmp eq (A & B), 0) & (icmp eq (A & D), 0) -> (icmp eq (A & (B|D)), 0) 33*9880d681SAndroid Build Coastguard Workerdefine i32 @main3(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { 34*9880d681SAndroid Build Coastguard Workerentry: 35*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 36*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and, 0 ; <i1> [#uses=1] 37*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 48 ; <i32> [#uses=1] 38*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, 0 ; <i1> [#uses=1] 39*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 40*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 41*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdefine i32 @main3b(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { 45*9880d681SAndroid Build Coastguard Workerentry: 46*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 47*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and, 0 ; <i1> [#uses=1] 48*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 16 ; <i32> [#uses=1] 49*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp ne i32 %and2, 16 ; <i1> [#uses=1] 50*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 51*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 52*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdefine i32 @main3e_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) 56*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 57*9880d681SAndroid Build Coastguard Workerentry: 58*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, %argc2 ; <i32> [#uses=1] 59*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and, 0 ; <i1> [#uses=1] 60*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, %argc3 ; <i32> [#uses=1] 61*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, 0 ; <i1> [#uses=1] 62*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 63*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 64*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker; (icmp ne (A & B), 0) | (icmp ne (A & D), 0) -> (icmp ne (A & (B|D)), 0) 68*9880d681SAndroid Build Coastguard Workerdefine i32 @main3c(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { 69*9880d681SAndroid Build Coastguard Workerentry: 70*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 71*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %and, 0 ; <i1> [#uses=1] 72*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 48 ; <i32> [#uses=1] 73*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp ne i32 %and2, 0 ; <i1> [#uses=1] 74*9880d681SAndroid Build Coastguard Worker %or.cond = or i1 %tobool, %tobool3 ; <i1> [#uses=1] 75*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %or.cond, i32 0, i32 1 ; <i32> [#uses=1] 76*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdefine i32 @main3d(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { 80*9880d681SAndroid Build Coastguard Workerentry: 81*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 82*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %and, 0 ; <i1> [#uses=1] 83*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 16 ; <i32> [#uses=1] 84*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, 16 ; <i1> [#uses=1] 85*9880d681SAndroid Build Coastguard Worker %or.cond = or i1 %tobool, %tobool3 ; <i1> [#uses=1] 86*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %or.cond, i32 0, i32 1 ; <i32> [#uses=1] 87*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdefine i32 @main3f_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) 91*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 92*9880d681SAndroid Build Coastguard Workerentry: 93*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, %argc2 ; <i32> [#uses=1] 94*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %and, 0 ; <i1> [#uses=1] 95*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, %argc3 ; <i32> [#uses=1] 96*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp ne i32 %and2, 0 ; <i1> [#uses=1] 97*9880d681SAndroid Build Coastguard Worker %or.cond = or i1 %tobool, %tobool3 ; <i1> [#uses=1] 98*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %or.cond, i32 0, i32 1 ; <i32> [#uses=1] 99*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker; (icmp eq (A & B), B) & (icmp eq (A & D), D) -> (icmp eq (A & (B|D)), (B|D)) 103*9880d681SAndroid Build Coastguard Workerdefine i32 @main4(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 106*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and, 7 ; <i1> [#uses=1] 107*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 48 ; <i32> [#uses=1] 108*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, 48 ; <i1> [#uses=1] 109*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 110*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 111*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefine i32 @main4b(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { 115*9880d681SAndroid Build Coastguard Workerentry: 116*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 117*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and, 7 ; <i1> [#uses=1] 118*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 16 ; <i32> [#uses=1] 119*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp ne i32 %and2, 0 ; <i1> [#uses=1] 120*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 121*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 122*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdefine i32 @main4e_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) 126*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 127*9880d681SAndroid Build Coastguard Workerentry: 128*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, %argc2 ; <i32> [#uses=1] 129*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and, %argc2 ; <i1> [#uses=1] 130*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, %argc3 ; <i32> [#uses=1] 131*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, %argc3 ; <i1> [#uses=1] 132*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 133*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 134*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; (icmp ne (A & B), B) | (icmp ne (A & D), D) -> (icmp ne (A & (B|D)), (B|D)) 138*9880d681SAndroid Build Coastguard Workerdefine i32 @main4c(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { 139*9880d681SAndroid Build Coastguard Workerentry: 140*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 141*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %and, 7 ; <i1> [#uses=1] 142*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 48 ; <i32> [#uses=1] 143*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp ne i32 %and2, 48 ; <i1> [#uses=1] 144*9880d681SAndroid Build Coastguard Worker %or.cond = or i1 %tobool, %tobool3 ; <i1> [#uses=1] 145*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %or.cond, i32 0, i32 1 ; <i32> [#uses=1] 146*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdefine i32 @main4d(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { 150*9880d681SAndroid Build Coastguard Workerentry: 151*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 152*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %and, 7 ; <i1> [#uses=1] 153*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 16 ; <i32> [#uses=1] 154*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, 0 ; <i1> [#uses=1] 155*9880d681SAndroid Build Coastguard Worker %or.cond = or i1 %tobool, %tobool3 ; <i1> [#uses=1] 156*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %or.cond, i32 0, i32 1 ; <i32> [#uses=1] 157*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workerdefine i32 @main4f_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) 161*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 162*9880d681SAndroid Build Coastguard Workerentry: 163*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, %argc2 ; <i32> [#uses=1] 164*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %and, %argc2 ; <i1> [#uses=1] 165*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, %argc3 ; <i32> [#uses=1] 166*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp ne i32 %and2, %argc3 ; <i1> [#uses=1] 167*9880d681SAndroid Build Coastguard Worker %or.cond = or i1 %tobool, %tobool3 ; <i1> [#uses=1] 168*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %or.cond, i32 0, i32 1 ; <i32> [#uses=1] 169*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 170*9880d681SAndroid Build Coastguard Worker} 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker; (icmp eq (A & B), A) & (icmp eq (A & D), A) -> (icmp eq (A & (B&D)), A) 173*9880d681SAndroid Build Coastguard Workerdefine i32 @main5_like(i32 %argc, i32 %argc2, i8** nocapture %argv) 174*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 175*9880d681SAndroid Build Coastguard Workerentry: 176*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 177*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and, 7 ; <i1> [#uses=1] 178*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc2, 7 ; <i32> [#uses=1] 179*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, 7 ; <i1> [#uses=1] 180*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 181*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 182*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerdefine i32 @main5e_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) 186*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 187*9880d681SAndroid Build Coastguard Workerentry: 188*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, %argc2 ; <i32> [#uses=1] 189*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and, %argc ; <i1> [#uses=1] 190*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, %argc3 ; <i32> [#uses=1] 191*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, %argc ; <i1> [#uses=1] 192*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 193*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 194*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker; (icmp ne (A & B), A) | (icmp ne (A & D), A) -> (icmp ne (A & (B&D)), A) 198*9880d681SAndroid Build Coastguard Workerdefine i32 @main5c_like(i32 %argc, i32 %argc2, i8** nocapture %argv) 199*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 200*9880d681SAndroid Build Coastguard Workerentry: 201*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 202*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %and, 7 ; <i1> [#uses=1] 203*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc2, 7 ; <i32> [#uses=1] 204*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp ne i32 %and2, 7 ; <i1> [#uses=1] 205*9880d681SAndroid Build Coastguard Worker %or.cond = or i1 %tobool, %tobool3 ; <i1> [#uses=1] 206*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %or.cond, i32 0, i32 1 ; <i32> [#uses=1] 207*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 208*9880d681SAndroid Build Coastguard Worker} 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Workerdefine i32 @main5f_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) 211*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 212*9880d681SAndroid Build Coastguard Workerentry: 213*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, %argc2 ; <i32> [#uses=1] 214*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %and, %argc ; <i1> [#uses=1] 215*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, %argc3 ; <i32> [#uses=1] 216*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp ne i32 %and2, %argc ; <i1> [#uses=1] 217*9880d681SAndroid Build Coastguard Worker %or.cond = or i1 %tobool, %tobool3 ; <i1> [#uses=1] 218*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %or.cond, i32 0, i32 1 ; <i32> [#uses=1] 219*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 220*9880d681SAndroid Build Coastguard Worker} 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Worker; (icmp eq (A & B), C) & (icmp eq (A & D), E) -> (icmp eq (A & (B|D)), (C|E)) 223*9880d681SAndroid Build Coastguard Worker; if B, C, D, E are constant, and it's possible 224*9880d681SAndroid Build Coastguard Workerdefine i32 @main6(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { 225*9880d681SAndroid Build Coastguard Workerentry: 226*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 227*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and, 3 ; <i1> [#uses=1] 228*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 48 ; <i32> [#uses=1] 229*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, 16 ; <i1> [#uses=1] 230*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 231*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 232*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 233*9880d681SAndroid Build Coastguard Worker} 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Workerdefine i32 @main6b(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { 236*9880d681SAndroid Build Coastguard Workerentry: 237*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 238*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and, 3 ; <i1> [#uses=1] 239*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 16 ; <i32> [#uses=1] 240*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp ne i32 %and2, 0 ; <i1> [#uses=1] 241*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 242*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 243*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 244*9880d681SAndroid Build Coastguard Worker} 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker; (icmp ne (A & B), C) | (icmp ne (A & D), E) -> (icmp ne (A & (B|D)), (C|E)) 247*9880d681SAndroid Build Coastguard Worker; if B, C, D, E are constant, and it's possible 248*9880d681SAndroid Build Coastguard Workerdefine i32 @main6c(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { 249*9880d681SAndroid Build Coastguard Workerentry: 250*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 251*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %and, 3 ; <i1> [#uses=1] 252*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 48 ; <i32> [#uses=1] 253*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp ne i32 %and2, 16 ; <i1> [#uses=1] 254*9880d681SAndroid Build Coastguard Worker %or.cond = or i1 %tobool, %tobool3 ; <i1> [#uses=1] 255*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %or.cond, i32 0, i32 1 ; <i32> [#uses=1] 256*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 257*9880d681SAndroid Build Coastguard Worker} 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Workerdefine i32 @main6d(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { 260*9880d681SAndroid Build Coastguard Workerentry: 261*9880d681SAndroid Build Coastguard Worker %and = and i32 %argc, 7 ; <i32> [#uses=1] 262*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %and, 3 ; <i1> [#uses=1] 263*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, 16 ; <i32> [#uses=1] 264*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, 0 ; <i1> [#uses=1] 265*9880d681SAndroid Build Coastguard Worker %or.cond = or i1 %tobool, %tobool3 ; <i1> [#uses=1] 266*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %or.cond, i32 0, i32 1 ; <i32> [#uses=1] 267*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 268*9880d681SAndroid Build Coastguard Worker} 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Worker; test parameter permutations 271*9880d681SAndroid Build Coastguard Worker; (B & A) == B & (D & A) == D 272*9880d681SAndroid Build Coastguard Workerdefine i32 @main7a(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) 273*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 274*9880d681SAndroid Build Coastguard Workerentry: 275*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %argc2, %argc ; <i32> [#uses=1] 276*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and1, %argc2 ; <i1> [#uses=1] 277*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc3, %argc ; <i32> [#uses=1] 278*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, %argc3 ; <i1> [#uses=1] 279*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 280*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 281*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 282*9880d681SAndroid Build Coastguard Worker} 283*9880d681SAndroid Build Coastguard Worker 284*9880d681SAndroid Build Coastguard Worker; B == (A & B) & D == (A & D) 285*9880d681SAndroid Build Coastguard Workerdefine i32 @main7b(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) 286*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 287*9880d681SAndroid Build Coastguard Workerentry: 288*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %argc, %argc2 ; <i32> [#uses=1] 289*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %argc2, %and1 ; <i1> [#uses=1] 290*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, %argc3 ; <i32> [#uses=1] 291*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %argc3, %and2 ; <i1> [#uses=1] 292*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 293*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 294*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 295*9880d681SAndroid Build Coastguard Worker} 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard Worker; B == (B & A) & D == (D & A) 298*9880d681SAndroid Build Coastguard Workerdefine i32 @main7c(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) 299*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 300*9880d681SAndroid Build Coastguard Workerentry: 301*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %argc2, %argc ; <i32> [#uses=1] 302*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %argc2, %and1 ; <i1> [#uses=1] 303*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc3, %argc ; <i32> [#uses=1] 304*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %argc3, %and2 ; <i1> [#uses=1] 305*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 306*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 307*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 308*9880d681SAndroid Build Coastguard Worker} 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Worker; (A & (B & C)) == (B & C) & (A & (D & E)) == (D & E) 311*9880d681SAndroid Build Coastguard Workerdefine i32 @main7d(i32 %argc, i32 %argc2, i32 %argc3, 312*9880d681SAndroid Build Coastguard Worker i32 %argc4, i32 %argc5, i8** nocapture %argv) 313*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 314*9880d681SAndroid Build Coastguard Workerentry: 315*9880d681SAndroid Build Coastguard Worker %bc = and i32 %argc2, %argc4 ; <i32> [#uses=1] 316*9880d681SAndroid Build Coastguard Worker %de = and i32 %argc3, %argc5 ; <i32> [#uses=1] 317*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %argc, %bc ; <i32> [#uses=1] 318*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and1, %bc ; <i1> [#uses=1] 319*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, %de ; <i32> [#uses=1] 320*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, %de ; <i1> [#uses=1] 321*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 322*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 323*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 324*9880d681SAndroid Build Coastguard Worker} 325*9880d681SAndroid Build Coastguard Worker 326*9880d681SAndroid Build Coastguard Worker; ((B & C) & A) == (B & C) & ((D & E) & A) == (D & E) 327*9880d681SAndroid Build Coastguard Workerdefine i32 @main7e(i32 %argc, i32 %argc2, i32 %argc3, 328*9880d681SAndroid Build Coastguard Worker i32 %argc4, i32 %argc5, i8** nocapture %argv) 329*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 330*9880d681SAndroid Build Coastguard Workerentry: 331*9880d681SAndroid Build Coastguard Worker %bc = and i32 %argc2, %argc4 ; <i32> [#uses=1] 332*9880d681SAndroid Build Coastguard Worker %de = and i32 %argc3, %argc5 ; <i32> [#uses=1] 333*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %bc, %argc ; <i32> [#uses=1] 334*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %and1, %bc ; <i1> [#uses=1] 335*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %de, %argc ; <i32> [#uses=1] 336*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %and2, %de ; <i1> [#uses=1] 337*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 338*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 339*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 340*9880d681SAndroid Build Coastguard Worker} 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Worker; (B & C) == (A & (B & C)) & (D & E) == (A & (D & E)) 343*9880d681SAndroid Build Coastguard Workerdefine i32 @main7f(i32 %argc, i32 %argc2, i32 %argc3, 344*9880d681SAndroid Build Coastguard Worker i32 %argc4, i32 %argc5, i8** nocapture %argv) 345*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 346*9880d681SAndroid Build Coastguard Workerentry: 347*9880d681SAndroid Build Coastguard Worker %bc = and i32 %argc2, %argc4 ; <i32> [#uses=1] 348*9880d681SAndroid Build Coastguard Worker %de = and i32 %argc3, %argc5 ; <i32> [#uses=1] 349*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %argc, %bc ; <i32> [#uses=1] 350*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %bc, %and1 ; <i1> [#uses=1] 351*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %argc, %de ; <i32> [#uses=1] 352*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %de, %and2 ; <i1> [#uses=1] 353*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 354*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 355*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 356*9880d681SAndroid Build Coastguard Worker} 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Worker; (B & C) == ((B & C) & A) & (D & E) == ((D & E) & A) 359*9880d681SAndroid Build Coastguard Workerdefine i32 @main7g(i32 %argc, i32 %argc2, i32 %argc3, 360*9880d681SAndroid Build Coastguard Worker i32 %argc4, i32 %argc5, i8** nocapture %argv) 361*9880d681SAndroid Build Coastguard Worker nounwind readnone ssp { 362*9880d681SAndroid Build Coastguard Workerentry: 363*9880d681SAndroid Build Coastguard Worker %bc = and i32 %argc2, %argc4 ; <i32> [#uses=1] 364*9880d681SAndroid Build Coastguard Worker %de = and i32 %argc3, %argc5 ; <i32> [#uses=1] 365*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %bc, %argc ; <i32> [#uses=1] 366*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %bc, %and1 ; <i1> [#uses=1] 367*9880d681SAndroid Build Coastguard Worker %and2 = and i32 %de, %argc ; <i32> [#uses=1] 368*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp eq i32 %de, %and2 ; <i1> [#uses=1] 369*9880d681SAndroid Build Coastguard Worker %and.cond = and i1 %tobool, %tobool3 ; <i1> [#uses=1] 370*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1] 371*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 372*9880d681SAndroid Build Coastguard Worker} 373