1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; There should be no 'and' instructions left in any test. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %A) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 9*9880d681SAndroid Build Coastguard Worker; 10*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, 0 11*9880d681SAndroid Build Coastguard Worker ret i32 %B 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %A) { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %A 17*9880d681SAndroid Build Coastguard Worker; 18*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, -1 19*9880d681SAndroid Build Coastguard Worker ret i32 %B 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i1 @test3(i1 %A) { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 25*9880d681SAndroid Build Coastguard Worker; 26*9880d681SAndroid Build Coastguard Worker %B = and i1 %A, false 27*9880d681SAndroid Build Coastguard Worker ret i1 %B 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine i1 @test4(i1 %A) { 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 %A 33*9880d681SAndroid Build Coastguard Worker; 34*9880d681SAndroid Build Coastguard Worker %B = and i1 %A, true 35*9880d681SAndroid Build Coastguard Worker ret i1 %B 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %A) { 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %A 41*9880d681SAndroid Build Coastguard Worker; 42*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, %A 43*9880d681SAndroid Build Coastguard Worker ret i32 %B 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine i1 @test6(i1 %A) { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 %A 49*9880d681SAndroid Build Coastguard Worker; 50*9880d681SAndroid Build Coastguard Worker %B = and i1 %A, %A 51*9880d681SAndroid Build Coastguard Worker ret i1 %B 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker; A & ~A == 0 55*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %A) { 56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 58*9880d681SAndroid Build Coastguard Worker; 59*9880d681SAndroid Build Coastguard Worker %NotA = xor i32 %A, -1 60*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, %NotA 61*9880d681SAndroid Build Coastguard Worker ret i32 %B 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; AND associates 65*9880d681SAndroid Build Coastguard Workerdefine i8 @test8(i8 %A) { 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 0 68*9880d681SAndroid Build Coastguard Worker; 69*9880d681SAndroid Build Coastguard Worker %B = and i8 %A, 3 70*9880d681SAndroid Build Coastguard Worker %C = and i8 %B, 4 71*9880d681SAndroid Build Coastguard Worker ret i8 %C 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker; Test of sign bit, convert to setle %A, 0 75*9880d681SAndroid Build Coastguard Workerdefine i1 @test9(i32 %A) { 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = icmp slt i32 %A, 0 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 79*9880d681SAndroid Build Coastguard Worker; 80*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, -2147483648 81*9880d681SAndroid Build Coastguard Worker %C = icmp ne i32 %B, 0 82*9880d681SAndroid Build Coastguard Worker ret i1 %C 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; Test of sign bit, convert to setle %A, 0 86*9880d681SAndroid Build Coastguard Workerdefine i1 @test9a(i32 %A) { 87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9a( 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = icmp slt i32 %A, 0 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 90*9880d681SAndroid Build Coastguard Worker; 91*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, -2147483648 92*9880d681SAndroid Build Coastguard Worker %C = icmp ne i32 %B, 0 93*9880d681SAndroid Build Coastguard Worker ret i1 %C 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i32 %A) { 97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 1 99*9880d681SAndroid Build Coastguard Worker; 100*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, 12 101*9880d681SAndroid Build Coastguard Worker %C = xor i32 %B, 15 102*9880d681SAndroid Build Coastguard Worker ; (X ^ C1) & C2 --> (X & C2) ^ (C1&C2) 103*9880d681SAndroid Build Coastguard Worker %D = and i32 %C, 1 104*9880d681SAndroid Build Coastguard Worker ret i32 %D 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %A, i32* %P) { 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = or i32 %A, 3 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = xor i32 [[B]], 12 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i32 [[C]], i32* %P, align 4 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 3 113*9880d681SAndroid Build Coastguard Worker; 114*9880d681SAndroid Build Coastguard Worker %B = or i32 %A, 3 115*9880d681SAndroid Build Coastguard Worker %C = xor i32 %B, 12 116*9880d681SAndroid Build Coastguard Worker ; additional use of C 117*9880d681SAndroid Build Coastguard Worker store i32 %C, i32* %P 118*9880d681SAndroid Build Coastguard Worker ; %C = and uint %B, 3 --> 3 119*9880d681SAndroid Build Coastguard Worker %D = and i32 %C, 3 120*9880d681SAndroid Build Coastguard Worker ret i32 %D 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine i1 @test12(i32 %A, i32 %B) { 124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 %A, %B 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 127*9880d681SAndroid Build Coastguard Worker; 128*9880d681SAndroid Build Coastguard Worker %C1 = icmp ult i32 %A, %B 129*9880d681SAndroid Build Coastguard Worker %C2 = icmp ule i32 %A, %B 130*9880d681SAndroid Build Coastguard Worker ; (A < B) & (A <= B) === (A < B) 131*9880d681SAndroid Build Coastguard Worker %D = and i1 %C1, %C2 132*9880d681SAndroid Build Coastguard Worker ret i1 %D 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerdefine i1 @test13(i32 %A, i32 %B) { 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 138*9880d681SAndroid Build Coastguard Worker; 139*9880d681SAndroid Build Coastguard Worker %C1 = icmp ult i32 %A, %B 140*9880d681SAndroid Build Coastguard Worker %C2 = icmp ugt i32 %A, %B 141*9880d681SAndroid Build Coastguard Worker ; (A < B) & (A > B) === false 142*9880d681SAndroid Build Coastguard Worker %D = and i1 %C1, %C2 143*9880d681SAndroid Build Coastguard Worker ret i1 %D 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerdefine i1 @test14(i8 %A) { 147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14( 148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = icmp slt i8 %A, 0 149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 150*9880d681SAndroid Build Coastguard Worker; 151*9880d681SAndroid Build Coastguard Worker %B = and i8 %A, -128 152*9880d681SAndroid Build Coastguard Worker %C = icmp ne i8 %B, 0 153*9880d681SAndroid Build Coastguard Worker ret i1 %C 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerdefine i8 @test15(i8 %A) { 157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15( 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 0 159*9880d681SAndroid Build Coastguard Worker; 160*9880d681SAndroid Build Coastguard Worker %B = lshr i8 %A, 7 161*9880d681SAndroid Build Coastguard Worker ; Always equals zero 162*9880d681SAndroid Build Coastguard Worker %C = and i8 %B, 2 163*9880d681SAndroid Build Coastguard Worker ret i8 %C 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerdefine i8 @test16(i8 %A) { 167*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16( 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 0 169*9880d681SAndroid Build Coastguard Worker; 170*9880d681SAndroid Build Coastguard Worker %B = shl i8 %A, 2 171*9880d681SAndroid Build Coastguard Worker %C = and i8 %B, 3 172*9880d681SAndroid Build Coastguard Worker ret i8 %C 173*9880d681SAndroid Build Coastguard Worker} 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker;; ~(~X & Y) --> (X | ~Y) 176*9880d681SAndroid Build Coastguard Workerdefine i8 @test17(i8 %X, i8 %Y) { 177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17( 178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y_NOT:%.*]] = xor i8 %Y, -1 179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = or i8 %X, [[Y_NOT]] 180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[D]] 181*9880d681SAndroid Build Coastguard Worker; 182*9880d681SAndroid Build Coastguard Worker %B = xor i8 %X, -1 183*9880d681SAndroid Build Coastguard Worker %C = and i8 %B, %Y 184*9880d681SAndroid Build Coastguard Worker %D = xor i8 %C, -1 185*9880d681SAndroid Build Coastguard Worker ret i8 %D 186*9880d681SAndroid Build Coastguard Worker} 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workerdefine i1 @test18(i32 %A) { 189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18( 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 %A, 127 191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 192*9880d681SAndroid Build Coastguard Worker; 193*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, -128 194*9880d681SAndroid Build Coastguard Worker ;; C >= 128 195*9880d681SAndroid Build Coastguard Worker %C = icmp ne i32 %B, 0 196*9880d681SAndroid Build Coastguard Worker ret i1 %C 197*9880d681SAndroid Build Coastguard Worker} 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Workerdefine i1 @test18a(i8 %A) { 200*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18a( 201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = icmp ult i8 %A, 2 202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 203*9880d681SAndroid Build Coastguard Worker; 204*9880d681SAndroid Build Coastguard Worker %B = and i8 %A, -2 205*9880d681SAndroid Build Coastguard Worker %C = icmp eq i8 %B, 0 206*9880d681SAndroid Build Coastguard Worker ret i1 %C 207*9880d681SAndroid Build Coastguard Worker} 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerdefine i32 @test19(i32 %A) { 210*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19( 211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = shl i32 %A, 3 212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[B]] 213*9880d681SAndroid Build Coastguard Worker; 214*9880d681SAndroid Build Coastguard Worker %B = shl i32 %A, 3 215*9880d681SAndroid Build Coastguard Worker ;; Clearing a zero bit 216*9880d681SAndroid Build Coastguard Worker %C = and i32 %B, -2 217*9880d681SAndroid Build Coastguard Worker ret i32 %C 218*9880d681SAndroid Build Coastguard Worker} 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Workerdefine i8 @test20(i8 %A) { 221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20( 222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = lshr i8 %A, 7 223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[C]] 224*9880d681SAndroid Build Coastguard Worker; 225*9880d681SAndroid Build Coastguard Worker %C = lshr i8 %A, 7 226*9880d681SAndroid Build Coastguard Worker ;; Unneeded 227*9880d681SAndroid Build Coastguard Worker %D = and i8 %C, 1 228*9880d681SAndroid Build Coastguard Worker ret i8 %D 229*9880d681SAndroid Build Coastguard Worker} 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Workerdefine i1 @test23(i32 %A) { 232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test23( 233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 %A, 2 234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 235*9880d681SAndroid Build Coastguard Worker; 236*9880d681SAndroid Build Coastguard Worker %B = icmp sgt i32 %A, 1 237*9880d681SAndroid Build Coastguard Worker %C = icmp sle i32 %A, 2 238*9880d681SAndroid Build Coastguard Worker ;; A == 2 239*9880d681SAndroid Build Coastguard Worker %D = and i1 %B, %C 240*9880d681SAndroid Build Coastguard Worker ret i1 %D 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerdefine i1 @test24(i32 %A) { 244*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24( 245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 %A, 2 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 247*9880d681SAndroid Build Coastguard Worker; 248*9880d681SAndroid Build Coastguard Worker %B = icmp sgt i32 %A, 1 249*9880d681SAndroid Build Coastguard Worker %C = icmp ne i32 %A, 2 250*9880d681SAndroid Build Coastguard Worker ;; A > 2 251*9880d681SAndroid Build Coastguard Worker %D = and i1 %B, %C 252*9880d681SAndroid Build Coastguard Worker ret i1 %D 253*9880d681SAndroid Build Coastguard Worker} 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Workerdefine i1 @test25(i32 %A) { 256*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test25( 257*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A_OFF:%.*]] = add i32 %A, -50 258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 [[A_OFF]], 50 259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 260*9880d681SAndroid Build Coastguard Worker; 261*9880d681SAndroid Build Coastguard Worker %B = icmp sge i32 %A, 50 262*9880d681SAndroid Build Coastguard Worker %C = icmp slt i32 %A, 100 263*9880d681SAndroid Build Coastguard Worker ;; (A-50) <u 50 264*9880d681SAndroid Build Coastguard Worker %D = and i1 %B, %C 265*9880d681SAndroid Build Coastguard Worker ret i1 %D 266*9880d681SAndroid Build Coastguard Worker} 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Workerdefine i1 @test26(i32 %A) { 269*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test26( 270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A_OFF:%.*]] = add i32 %A, -49 271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A_CMP:%.*]] = icmp ugt i32 [[A_OFF]], 1 272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[A_CMP]] 273*9880d681SAndroid Build Coastguard Worker; 274*9880d681SAndroid Build Coastguard Worker %B = icmp ne i32 %A, 49 275*9880d681SAndroid Build Coastguard Worker %C = icmp ne i32 %A, 50 276*9880d681SAndroid Build Coastguard Worker ;; (A-49) > 1 277*9880d681SAndroid Build Coastguard Worker %D = and i1 %B, %C 278*9880d681SAndroid Build Coastguard Worker ret i1 %D 279*9880d681SAndroid Build Coastguard Worker} 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Workerdefine i8 @test27(i8 %A) { 282*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test27( 283*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 0 284*9880d681SAndroid Build Coastguard Worker; 285*9880d681SAndroid Build Coastguard Worker %B = and i8 %A, 4 286*9880d681SAndroid Build Coastguard Worker %C = sub i8 %B, 16 287*9880d681SAndroid Build Coastguard Worker ;; 0xF0 288*9880d681SAndroid Build Coastguard Worker %D = and i8 %C, -16 289*9880d681SAndroid Build Coastguard Worker %E = add i8 %D, 16 290*9880d681SAndroid Build Coastguard Worker ret i8 %E 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker;; This is juse a zero extending shr. 294*9880d681SAndroid Build Coastguard Workerdefine i32 @test28(i32 %X) { 295*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test28( 296*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y1:%.*]] = lshr i32 %X, 24 297*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Y1]] 298*9880d681SAndroid Build Coastguard Worker; 299*9880d681SAndroid Build Coastguard Worker ;; Sign extend 300*9880d681SAndroid Build Coastguard Worker %Y = ashr i32 %X, 24 301*9880d681SAndroid Build Coastguard Worker ;; Mask out sign bits 302*9880d681SAndroid Build Coastguard Worker %Z = and i32 %Y, 255 303*9880d681SAndroid Build Coastguard Worker ret i32 %Z 304*9880d681SAndroid Build Coastguard Worker} 305*9880d681SAndroid Build Coastguard Worker 306*9880d681SAndroid Build Coastguard Workerdefine i32 @test29(i8 %X) { 307*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test29( 308*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y:%.*]] = zext i8 %X to i32 309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Y]] 310*9880d681SAndroid Build Coastguard Worker; 311*9880d681SAndroid Build Coastguard Worker %Y = zext i8 %X to i32 312*9880d681SAndroid Build Coastguard Worker ;; Zero extend makes this unneeded. 313*9880d681SAndroid Build Coastguard Worker %Z = and i32 %Y, 255 314*9880d681SAndroid Build Coastguard Worker ret i32 %Z 315*9880d681SAndroid Build Coastguard Worker} 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Workerdefine i32 @test30(i1 %X) { 318*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test30( 319*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y:%.*]] = zext i1 %X to i32 320*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Y]] 321*9880d681SAndroid Build Coastguard Worker; 322*9880d681SAndroid Build Coastguard Worker %Y = zext i1 %X to i32 323*9880d681SAndroid Build Coastguard Worker %Z = and i32 %Y, 1 324*9880d681SAndroid Build Coastguard Worker ret i32 %Z 325*9880d681SAndroid Build Coastguard Worker} 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Workerdefine i32 @test31(i1 %X) { 328*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test31( 329*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y:%.*]] = zext i1 %X to i32 330*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = shl nuw nsw i32 [[Y]], 4 331*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Z]] 332*9880d681SAndroid Build Coastguard Worker; 333*9880d681SAndroid Build Coastguard Worker %Y = zext i1 %X to i32 334*9880d681SAndroid Build Coastguard Worker %Z = shl i32 %Y, 4 335*9880d681SAndroid Build Coastguard Worker %A = and i32 %Z, 16 336*9880d681SAndroid Build Coastguard Worker ret i32 %A 337*9880d681SAndroid Build Coastguard Worker} 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Workerdefine i32 @test32(i32 %In) { 340*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test32( 341*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 342*9880d681SAndroid Build Coastguard Worker; 343*9880d681SAndroid Build Coastguard Worker %Y = and i32 %In, 16 344*9880d681SAndroid Build Coastguard Worker %Z = lshr i32 %Y, 2 345*9880d681SAndroid Build Coastguard Worker %A = and i32 %Z, 1 346*9880d681SAndroid Build Coastguard Worker ret i32 %A 347*9880d681SAndroid Build Coastguard Worker} 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Worker;; Code corresponding to one-bit bitfield ^1. 350*9880d681SAndroid Build Coastguard Workerdefine i32 @test33(i32 %b) { 351*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test33( 352*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_13:%.*]] = xor i32 %b, 1 353*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[TMP_13]] 354*9880d681SAndroid Build Coastguard Worker; 355*9880d681SAndroid Build Coastguard Worker %tmp.4.mask = and i32 %b, 1 356*9880d681SAndroid Build Coastguard Worker %tmp.10 = xor i32 %tmp.4.mask, 1 357*9880d681SAndroid Build Coastguard Worker %tmp.12 = and i32 %b, -2 358*9880d681SAndroid Build Coastguard Worker %tmp.13 = or i32 %tmp.12, %tmp.10 359*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.13 360*9880d681SAndroid Build Coastguard Worker} 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Workerdefine i32 @test34(i32 %A, i32 %B) { 363*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test34( 364*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %B 365*9880d681SAndroid Build Coastguard Worker; 366*9880d681SAndroid Build Coastguard Worker %tmp.2 = or i32 %B, %A 367*9880d681SAndroid Build Coastguard Worker %tmp.4 = and i32 %tmp.2, %B 368*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.4 369*9880d681SAndroid Build Coastguard Worker} 370*9880d681SAndroid Build Coastguard Worker 371