1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; This test makes sure that these instructions are properly eliminated. 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 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 %A 9*9880d681SAndroid Build Coastguard Worker; 10*9880d681SAndroid Build Coastguard Worker %B = shl i32 %A, 0 ; <i32> [#uses=1] 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(i8 %A) { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 17*9880d681SAndroid Build Coastguard Worker; 18*9880d681SAndroid Build Coastguard Worker %shift.upgrd.1 = zext i8 %A to i32 ; <i32> [#uses=1] 19*9880d681SAndroid Build Coastguard Worker %B = shl i32 0, %shift.upgrd.1 ; <i32> [#uses=1] 20*9880d681SAndroid Build Coastguard Worker ret i32 %B 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %A) { 24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %A 26*9880d681SAndroid Build Coastguard Worker; 27*9880d681SAndroid Build Coastguard Worker %B = ashr i32 %A, 0 ; <i32> [#uses=1] 28*9880d681SAndroid Build Coastguard Worker ret i32 %B 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i8 %A) { 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 34*9880d681SAndroid Build Coastguard Worker; 35*9880d681SAndroid Build Coastguard Worker %shift.upgrd.2 = zext i8 %A to i32 ; <i32> [#uses=1] 36*9880d681SAndroid Build Coastguard Worker %B = ashr i32 0, %shift.upgrd.2 ; <i32> [#uses=1] 37*9880d681SAndroid Build Coastguard Worker ret i32 %B 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %A) { 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 undef 44*9880d681SAndroid Build Coastguard Worker; 45*9880d681SAndroid Build Coastguard Worker %B = lshr i32 %A, 32 ;; shift all bits out 46*9880d681SAndroid Build Coastguard Worker ret i32 %B 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5_splat_vector(<4 x i32> %A) { 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5_splat_vector( 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> undef 52*9880d681SAndroid Build Coastguard Worker; 53*9880d681SAndroid Build Coastguard Worker %B = lshr <4 x i32> %A, <i32 32, i32 32, i32 32, i32 32> ;; shift all bits out 54*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %B 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5_zero_vector(<4 x i32> %A) { 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5_zero_vector( 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> %A 60*9880d681SAndroid Build Coastguard Worker; 61*9880d681SAndroid Build Coastguard Worker %B = lshr <4 x i32> %A, zeroinitializer 62*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %B 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5_non_splat_vector(<4 x i32> %A) { 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5_non_splat_vector( 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = lshr <4 x i32> %A, <i32 32, i32 1, i32 2, i32 3> 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> [[B]] 69*9880d681SAndroid Build Coastguard Worker; 70*9880d681SAndroid Build Coastguard Worker %B = lshr <4 x i32> %A, <i32 32, i32 1, i32 2, i32 3> 71*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %B 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine i32 @test5a(i32 %A) { 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5a( 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 undef 77*9880d681SAndroid Build Coastguard Worker; 78*9880d681SAndroid Build Coastguard Worker %B = shl i32 %A, 32 ;; shift all bits out 79*9880d681SAndroid Build Coastguard Worker ret i32 %B 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5a_splat_vector(<4 x i32> %A) { 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5a_splat_vector( 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> undef 85*9880d681SAndroid Build Coastguard Worker; 86*9880d681SAndroid Build Coastguard Worker %B = shl <4 x i32> %A, <i32 32, i32 32, i32 32, i32 32> ;; shift all bits out 87*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %B 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5a_non_splat_vector(<4 x i32> %A) { 91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5a_non_splat_vector( 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = shl <4 x i32> %A, <i32 32, i32 1, i32 2, i32 3> 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> [[B]] 94*9880d681SAndroid Build Coastguard Worker; 95*9880d681SAndroid Build Coastguard Worker %B = shl <4 x i32> %A, <i32 32, i32 1, i32 2, i32 3> 96*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %B 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine i32 @test5b() { 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5b( 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 102*9880d681SAndroid Build Coastguard Worker; 103*9880d681SAndroid Build Coastguard Worker %B = ashr i32 undef, 2 ;; top two bits must be equal, so not undef 104*9880d681SAndroid Build Coastguard Worker ret i32 %B 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdefine i32 @test5b2(i32 %A) { 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5b2( 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 110*9880d681SAndroid Build Coastguard Worker; 111*9880d681SAndroid Build Coastguard Worker %B = ashr i32 undef, %A ;; top %A bits must be equal, so not undef 112*9880d681SAndroid Build Coastguard Worker ret i32 %B 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32 %A) { 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = mul i32 %A, 6 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[C]] 119*9880d681SAndroid Build Coastguard Worker; 120*9880d681SAndroid Build Coastguard Worker %B = shl i32 %A, 1 ;; convert to an mul instruction 121*9880d681SAndroid Build Coastguard Worker %C = mul i32 %B, 3 122*9880d681SAndroid Build Coastguard Worker ret i32 %C 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdefine i32 @test6a(i32 %A) { 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6a( 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = mul i32 %A, 6 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[C]] 129*9880d681SAndroid Build Coastguard Worker; 130*9880d681SAndroid Build Coastguard Worker %B = mul i32 %A, 3 131*9880d681SAndroid Build Coastguard Worker %C = shl i32 %B, 1 ;; convert to an mul instruction 132*9880d681SAndroid Build Coastguard Worker ret i32 %C 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i8 %A) { 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 -1 138*9880d681SAndroid Build Coastguard Worker; 139*9880d681SAndroid Build Coastguard Worker %shift.upgrd.3 = zext i8 %A to i32 140*9880d681SAndroid Build Coastguard Worker %B = ashr i32 -1, %shift.upgrd.3 ;; Always equal to -1 141*9880d681SAndroid Build Coastguard Worker ret i32 %B 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker;; (A << 5) << 3 === A << 8 == 0 145*9880d681SAndroid Build Coastguard Workerdefine i8 @test8(i8 %A) { 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 0 148*9880d681SAndroid Build Coastguard Worker; 149*9880d681SAndroid Build Coastguard Worker %B = shl i8 %A, 5 ; <i8> [#uses=1] 150*9880d681SAndroid Build Coastguard Worker %C = shl i8 %B, 3 ; <i8> [#uses=1] 151*9880d681SAndroid Build Coastguard Worker ret i8 %C 152*9880d681SAndroid Build Coastguard Worker} 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker;; (A << 7) >> 7 === A & 1 155*9880d681SAndroid Build Coastguard Workerdefine i8 @test9(i8 %A) { 156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = and i8 %A, 1 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[B]] 159*9880d681SAndroid Build Coastguard Worker; 160*9880d681SAndroid Build Coastguard Worker %B = shl i8 %A, 7 ; <i8> [#uses=1] 161*9880d681SAndroid Build Coastguard Worker %C = lshr i8 %B, 7 ; <i8> [#uses=1] 162*9880d681SAndroid Build Coastguard Worker ret i8 %C 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker;; This transformation is deferred to DAGCombine: 166*9880d681SAndroid Build Coastguard Worker;; (A >> 7) << 7 === A & 128 167*9880d681SAndroid Build Coastguard Worker;; The shl may be valuable to scalar evolution. 168*9880d681SAndroid Build Coastguard Workerdefine i8 @test10(i8 %A) { 169*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = and i8 %A, -128 171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[B]] 172*9880d681SAndroid Build Coastguard Worker; 173*9880d681SAndroid Build Coastguard Worker %B = lshr i8 %A, 7 ; <i8> [#uses=1] 174*9880d681SAndroid Build Coastguard Worker %C = shl i8 %B, 7 ; <i8> [#uses=1] 175*9880d681SAndroid Build Coastguard Worker ret i8 %C 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker;; Allow the simplification when the lshr shift is exact. 179*9880d681SAndroid Build Coastguard Workerdefine i8 @test10a(i8 %A) { 180*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10a( 181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 %A 182*9880d681SAndroid Build Coastguard Worker; 183*9880d681SAndroid Build Coastguard Worker %B = lshr exact i8 %A, 7 184*9880d681SAndroid Build Coastguard Worker %C = shl i8 %B, 7 185*9880d681SAndroid Build Coastguard Worker ret i8 %C 186*9880d681SAndroid Build Coastguard Worker} 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker;; This transformation is deferred to DAGCombine: 189*9880d681SAndroid Build Coastguard Worker;; (A >> 3) << 4 === (A & 0x1F) << 1 190*9880d681SAndroid Build Coastguard Worker;; The shl may be valuable to scalar evolution. 191*9880d681SAndroid Build Coastguard Workerdefine i8 @test11(i8 %A) { 192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A:%.*]] = mul i8 %A, 3 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = lshr i8 [[A]], 3 195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = shl i8 [[B]], 4 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[C]] 197*9880d681SAndroid Build Coastguard Worker; 198*9880d681SAndroid Build Coastguard Worker %a = mul i8 %A, 3 ; <i8> [#uses=1] 199*9880d681SAndroid Build Coastguard Worker %B = lshr i8 %a, 3 ; <i8> [#uses=1] 200*9880d681SAndroid Build Coastguard Worker %C = shl i8 %B, 4 ; <i8> [#uses=1] 201*9880d681SAndroid Build Coastguard Worker ret i8 %C 202*9880d681SAndroid Build Coastguard Worker} 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker;; Allow the simplification in InstCombine when the lshr shift is exact. 205*9880d681SAndroid Build Coastguard Workerdefine i8 @test11a(i8 %A) { 206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11a( 207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = mul i8 %A, 6 208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[C]] 209*9880d681SAndroid Build Coastguard Worker; 210*9880d681SAndroid Build Coastguard Worker %a = mul i8 %A, 3 211*9880d681SAndroid Build Coastguard Worker %B = lshr exact i8 %a, 3 212*9880d681SAndroid Build Coastguard Worker %C = shl i8 %B, 4 213*9880d681SAndroid Build Coastguard Worker ret i8 %C 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker;; This is deferred to DAGCombine unless %B is single-use. 217*9880d681SAndroid Build Coastguard Worker;; (A >> 8) << 8 === A & -256 218*9880d681SAndroid Build Coastguard Workerdefine i32 @test12(i32 %A) { 219*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B1:%.*]] = and i32 %A, -256 221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[B1]] 222*9880d681SAndroid Build Coastguard Worker; 223*9880d681SAndroid Build Coastguard Worker %B = ashr i32 %A, 8 ; <i32> [#uses=1] 224*9880d681SAndroid Build Coastguard Worker %C = shl i32 %B, 8 ; <i32> [#uses=1] 225*9880d681SAndroid Build Coastguard Worker ret i32 %C 226*9880d681SAndroid Build Coastguard Worker} 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Worker;; This transformation is deferred to DAGCombine: 229*9880d681SAndroid Build Coastguard Worker;; (A >> 3) << 4 === (A & -8) * 2 230*9880d681SAndroid Build Coastguard Worker;; The shl may be valuable to scalar evolution. 231*9880d681SAndroid Build Coastguard Workerdefine i8 @test13(i8 %A) { 232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A:%.*]] = mul i8 %A, 3 234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B1:%.*]] = lshr i8 [[A]], 3 235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = shl i8 [[B1]], 4 236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[C]] 237*9880d681SAndroid Build Coastguard Worker; 238*9880d681SAndroid Build Coastguard Worker %a = mul i8 %A, 3 ; <i8> [#uses=1] 239*9880d681SAndroid Build Coastguard Worker %B = ashr i8 %a, 3 ; <i8> [#uses=1] 240*9880d681SAndroid Build Coastguard Worker %C = shl i8 %B, 4 ; <i8> [#uses=1] 241*9880d681SAndroid Build Coastguard Worker ret i8 %C 242*9880d681SAndroid Build Coastguard Worker} 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Workerdefine i8 @test13a(i8 %A) { 245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13a( 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = mul i8 %A, 6 247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[C]] 248*9880d681SAndroid Build Coastguard Worker; 249*9880d681SAndroid Build Coastguard Worker %a = mul i8 %A, 3 250*9880d681SAndroid Build Coastguard Worker %B = ashr exact i8 %a, 3 251*9880d681SAndroid Build Coastguard Worker %C = shl i8 %B, 4 252*9880d681SAndroid Build Coastguard Worker ret i8 %C 253*9880d681SAndroid Build Coastguard Worker} 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker;; D = ((B | 1234) << 4) === ((B << 4)|(1234 << 4) 256*9880d681SAndroid Build Coastguard Workerdefine i32 @test14(i32 %A) { 257*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14( 258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = and i32 %A, -19760 259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = or i32 [[B]], 19744 260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[C]] 261*9880d681SAndroid Build Coastguard Worker; 262*9880d681SAndroid Build Coastguard Worker %B = lshr i32 %A, 4 ; <i32> [#uses=1] 263*9880d681SAndroid Build Coastguard Worker %C = or i32 %B, 1234 ; <i32> [#uses=1] 264*9880d681SAndroid Build Coastguard Worker %D = shl i32 %C, 4 ; <i32> [#uses=1] 265*9880d681SAndroid Build Coastguard Worker ret i32 %D 266*9880d681SAndroid Build Coastguard Worker} 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Worker;; D = ((B | 1234) << 4) === ((B << 4)|(1234 << 4) 269*9880d681SAndroid Build Coastguard Workerdefine i32 @test14a(i32 %A) { 270*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14a( 271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = and i32 %A, 77 272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[C]] 273*9880d681SAndroid Build Coastguard Worker; 274*9880d681SAndroid Build Coastguard Worker %B = shl i32 %A, 4 ; <i32> [#uses=1] 275*9880d681SAndroid Build Coastguard Worker %C = and i32 %B, 1234 ; <i32> [#uses=1] 276*9880d681SAndroid Build Coastguard Worker %D = lshr i32 %C, 4 ; <i32> [#uses=1] 277*9880d681SAndroid Build Coastguard Worker ret i32 %D 278*9880d681SAndroid Build Coastguard Worker} 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Workerdefine i32 @test15(i1 %C) { 281*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15( 282*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A:%.*]] = select i1 %C, i32 12, i32 4 283*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[A]] 284*9880d681SAndroid Build Coastguard Worker; 285*9880d681SAndroid Build Coastguard Worker %A = select i1 %C, i32 3, i32 1 ; <i32> [#uses=1] 286*9880d681SAndroid Build Coastguard Worker %V = shl i32 %A, 2 ; <i32> [#uses=1] 287*9880d681SAndroid Build Coastguard Worker ret i32 %V 288*9880d681SAndroid Build Coastguard Worker} 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Workerdefine i32 @test15a(i1 %C) { 291*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15a( 292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[V:%.*]] = select i1 %C, i32 512, i32 128 293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[V]] 294*9880d681SAndroid Build Coastguard Worker; 295*9880d681SAndroid Build Coastguard Worker %A = select i1 %C, i8 3, i8 1 ; <i8> [#uses=1] 296*9880d681SAndroid Build Coastguard Worker %shift.upgrd.4 = zext i8 %A to i32 ; <i32> [#uses=1] 297*9880d681SAndroid Build Coastguard Worker %V = shl i32 64, %shift.upgrd.4 ; <i32> [#uses=1] 298*9880d681SAndroid Build Coastguard Worker ret i32 %V 299*9880d681SAndroid Build Coastguard Worker} 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Workerdefine i1 @test16(i32 %X) { 302*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16( 303*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_6:%.*]] = and i32 %X, 16 304*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_7:%.*]] = icmp ne i32 [[TMP_6]], 0 305*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP_7]] 306*9880d681SAndroid Build Coastguard Worker; 307*9880d681SAndroid Build Coastguard Worker %tmp.3 = ashr i32 %X, 4 308*9880d681SAndroid Build Coastguard Worker %tmp.6 = and i32 %tmp.3, 1 309*9880d681SAndroid Build Coastguard Worker %tmp.7 = icmp ne i32 %tmp.6, 0 310*9880d681SAndroid Build Coastguard Worker ret i1 %tmp.7 311*9880d681SAndroid Build Coastguard Worker} 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Workerdefine i1 @test17(i32 %A) { 314*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17( 315*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B_MASK:%.*]] = and i32 %A, -8 316*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[B_MASK]], 9872 317*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 318*9880d681SAndroid Build Coastguard Worker; 319*9880d681SAndroid Build Coastguard Worker %B = lshr i32 %A, 3 ; <i32> [#uses=1] 320*9880d681SAndroid Build Coastguard Worker %C = icmp eq i32 %B, 1234 ; <i1> [#uses=1] 321*9880d681SAndroid Build Coastguard Worker ret i1 %C 322*9880d681SAndroid Build Coastguard Worker} 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Workerdefine i1 @test18(i8 %A) { 326*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18( 327*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 328*9880d681SAndroid Build Coastguard Worker; 329*9880d681SAndroid Build Coastguard Worker %B = lshr i8 %A, 7 ; <i8> [#uses=1] 330*9880d681SAndroid Build Coastguard Worker ;; false 331*9880d681SAndroid Build Coastguard Worker %C = icmp eq i8 %B, 123 ; <i1> [#uses=1] 332*9880d681SAndroid Build Coastguard Worker ret i1 %C 333*9880d681SAndroid Build Coastguard Worker} 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Workerdefine i1 @test19(i32 %A) { 336*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19( 337*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = icmp ult i32 %A, 4 338*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 339*9880d681SAndroid Build Coastguard Worker; 340*9880d681SAndroid Build Coastguard Worker %B = ashr i32 %A, 2 ; <i32> [#uses=1] 341*9880d681SAndroid Build Coastguard Worker ;; (X & -4) == 0 342*9880d681SAndroid Build Coastguard Worker %C = icmp eq i32 %B, 0 ; <i1> [#uses=1] 343*9880d681SAndroid Build Coastguard Worker ret i1 %C 344*9880d681SAndroid Build Coastguard Worker} 345*9880d681SAndroid Build Coastguard Worker 346*9880d681SAndroid Build Coastguard Worker 347*9880d681SAndroid Build Coastguard Workerdefine i1 @test19a(i32 %A) { 348*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19a( 349*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 %A, -5 350*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 351*9880d681SAndroid Build Coastguard Worker; 352*9880d681SAndroid Build Coastguard Worker %B = ashr i32 %A, 2 ; <i32> [#uses=1] 353*9880d681SAndroid Build Coastguard Worker ;; X >u ~4 354*9880d681SAndroid Build Coastguard Worker %C = icmp eq i32 %B, -1 ; <i1> [#uses=1] 355*9880d681SAndroid Build Coastguard Worker ret i1 %C 356*9880d681SAndroid Build Coastguard Worker} 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Workerdefine i1 @test20(i8 %A) { 359*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20( 360*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 361*9880d681SAndroid Build Coastguard Worker; 362*9880d681SAndroid Build Coastguard Worker %B = ashr i8 %A, 7 ; <i8> [#uses=1] 363*9880d681SAndroid Build Coastguard Worker ;; false 364*9880d681SAndroid Build Coastguard Worker %C = icmp eq i8 %B, 123 ; <i1> [#uses=1] 365*9880d681SAndroid Build Coastguard Worker ret i1 %C 366*9880d681SAndroid Build Coastguard Worker} 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Workerdefine i1 @test21(i8 %A) { 369*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test21( 370*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B_MASK:%.*]] = and i8 %A, 15 371*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[B_MASK]], 8 372*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 373*9880d681SAndroid Build Coastguard Worker; 374*9880d681SAndroid Build Coastguard Worker %B = shl i8 %A, 4 ; <i8> [#uses=1] 375*9880d681SAndroid Build Coastguard Worker %C = icmp eq i8 %B, -128 ; <i1> [#uses=1] 376*9880d681SAndroid Build Coastguard Worker ret i1 %C 377*9880d681SAndroid Build Coastguard Worker} 378*9880d681SAndroid Build Coastguard Worker 379*9880d681SAndroid Build Coastguard Workerdefine i1 @test22(i8 %A) { 380*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test22( 381*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B_MASK:%.*]] = and i8 %A, 15 382*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[B_MASK]], 0 383*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 384*9880d681SAndroid Build Coastguard Worker; 385*9880d681SAndroid Build Coastguard Worker %B = shl i8 %A, 4 ; <i8> [#uses=1] 386*9880d681SAndroid Build Coastguard Worker %C = icmp eq i8 %B, 0 ; <i1> [#uses=1] 387*9880d681SAndroid Build Coastguard Worker ret i1 %C 388*9880d681SAndroid Build Coastguard Worker} 389*9880d681SAndroid Build Coastguard Worker 390*9880d681SAndroid Build Coastguard Workerdefine i8 @test23(i32 %A) { 391*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test23( 392*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = trunc i32 %A to i8 393*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[D]] 394*9880d681SAndroid Build Coastguard Worker; 395*9880d681SAndroid Build Coastguard Worker ;; casts not needed 396*9880d681SAndroid Build Coastguard Worker %B = shl i32 %A, 24 ; <i32> [#uses=1] 397*9880d681SAndroid Build Coastguard Worker %C = ashr i32 %B, 24 ; <i32> [#uses=1] 398*9880d681SAndroid Build Coastguard Worker %D = trunc i32 %C to i8 ; <i8> [#uses=1] 399*9880d681SAndroid Build Coastguard Worker ret i8 %D 400*9880d681SAndroid Build Coastguard Worker} 401*9880d681SAndroid Build Coastguard Worker 402*9880d681SAndroid Build Coastguard Workerdefine i8 @test24(i8 %X) { 403*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24( 404*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = and i8 %X, 3 405*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[Z]] 406*9880d681SAndroid Build Coastguard Worker; 407*9880d681SAndroid Build Coastguard Worker %Y = and i8 %X, -5 ; <i8> [#uses=1] 408*9880d681SAndroid Build Coastguard Worker %Z = shl i8 %Y, 5 ; <i8> [#uses=1] 409*9880d681SAndroid Build Coastguard Worker %Q = ashr i8 %Z, 5 ; <i8> [#uses=1] 410*9880d681SAndroid Build Coastguard Worker ret i8 %Q 411*9880d681SAndroid Build Coastguard Worker} 412*9880d681SAndroid Build Coastguard Worker 413*9880d681SAndroid Build Coastguard Workerdefine i32 @test25(i32 %tmp.2, i32 %AA) { 414*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test25( 415*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_3:%.*]] = and i32 %tmp.2, -131072 416*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[X2:%.*]] = add i32 [[TMP_3]], %AA 417*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_6:%.*]] = and i32 [[X2]], -131072 418*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[TMP_6]] 419*9880d681SAndroid Build Coastguard Worker; 420*9880d681SAndroid Build Coastguard Worker %x = lshr i32 %AA, 17 ; <i32> [#uses=1] 421*9880d681SAndroid Build Coastguard Worker %tmp.3 = lshr i32 %tmp.2, 17 ; <i32> [#uses=1] 422*9880d681SAndroid Build Coastguard Worker %tmp.5 = add i32 %tmp.3, %x ; <i32> [#uses=1] 423*9880d681SAndroid Build Coastguard Worker %tmp.6 = shl i32 %tmp.5, 17 ; <i32> [#uses=1] 424*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.6 425*9880d681SAndroid Build Coastguard Worker} 426*9880d681SAndroid Build Coastguard Worker 427*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test25_vector(<2 x i32> %tmp.2, <2 x i32> %AA) { 428*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test25_vector( 429*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_3:%.*]] = lshr <2 x i32> %tmp.2, <i32 17, i32 17> 430*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_51:%.*]] = shl <2 x i32> [[TMP_3]], <i32 17, i32 17> 431*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[X2:%.*]] = add <2 x i32> [[TMP_51]], %AA 432*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_6:%.*]] = and <2 x i32> [[X2]], <i32 -131072, i32 -131072> 433*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i32> [[TMP_6]] 434*9880d681SAndroid Build Coastguard Worker; 435*9880d681SAndroid Build Coastguard Worker %x = lshr <2 x i32> %AA, <i32 17, i32 17> 436*9880d681SAndroid Build Coastguard Worker %tmp.3 = lshr <2 x i32> %tmp.2, <i32 17, i32 17> 437*9880d681SAndroid Build Coastguard Worker %tmp.5 = add <2 x i32> %tmp.3, %x 438*9880d681SAndroid Build Coastguard Worker %tmp.6 = shl <2 x i32> %tmp.5, <i32 17, i32 17> 439*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %tmp.6 440*9880d681SAndroid Build Coastguard Worker} 441*9880d681SAndroid Build Coastguard Worker 442*9880d681SAndroid Build Coastguard Worker;; handle casts between shifts. 443*9880d681SAndroid Build Coastguard Workerdefine i32 @test26(i32 %A) { 444*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test26( 445*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = and i32 %A, -2 446*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[B]] 447*9880d681SAndroid Build Coastguard Worker; 448*9880d681SAndroid Build Coastguard Worker %B = lshr i32 %A, 1 ; <i32> [#uses=1] 449*9880d681SAndroid Build Coastguard Worker %C = bitcast i32 %B to i32 ; <i32> [#uses=1] 450*9880d681SAndroid Build Coastguard Worker %D = shl i32 %C, 1 ; <i32> [#uses=1] 451*9880d681SAndroid Build Coastguard Worker ret i32 %D 452*9880d681SAndroid Build Coastguard Worker} 453*9880d681SAndroid Build Coastguard Worker 454*9880d681SAndroid Build Coastguard Worker 455*9880d681SAndroid Build Coastguard Workerdefine i1 @test27(i32 %x) nounwind { 456*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test27( 457*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = and i32 %x, 8 458*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = icmp ne i32 [[TMP1]], 0 459*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[Z]] 460*9880d681SAndroid Build Coastguard Worker; 461*9880d681SAndroid Build Coastguard Worker %y = lshr i32 %x, 3 462*9880d681SAndroid Build Coastguard Worker %z = trunc i32 %y to i1 463*9880d681SAndroid Build Coastguard Worker ret i1 %z 464*9880d681SAndroid Build Coastguard Worker} 465*9880d681SAndroid Build Coastguard Worker 466*9880d681SAndroid Build Coastguard Workerdefine i8 @test28(i8 %x) { 467*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test28( 468*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 469*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[COND1:%.*]] = icmp slt i8 %x, 0 470*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 [[COND1]], label %bb1, label %bb2 471*9880d681SAndroid Build Coastguard Worker; CHECK: bb1: 472*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 0 473*9880d681SAndroid Build Coastguard Worker; CHECK: bb2: 474*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 1 475*9880d681SAndroid Build Coastguard Worker; 476*9880d681SAndroid Build Coastguard Workerentry: 477*9880d681SAndroid Build Coastguard Worker %tmp1 = lshr i8 %x, 7 478*9880d681SAndroid Build Coastguard Worker %cond1 = icmp ne i8 %tmp1, 0 479*9880d681SAndroid Build Coastguard Worker br i1 %cond1, label %bb1, label %bb2 480*9880d681SAndroid Build Coastguard Worker 481*9880d681SAndroid Build Coastguard Workerbb1: 482*9880d681SAndroid Build Coastguard Worker ret i8 0 483*9880d681SAndroid Build Coastguard Worker 484*9880d681SAndroid Build Coastguard Workerbb2: 485*9880d681SAndroid Build Coastguard Worker ret i8 1 486*9880d681SAndroid Build Coastguard Worker} 487*9880d681SAndroid Build Coastguard Worker 488*9880d681SAndroid Build Coastguard Workerdefine i8 @test28a(i8 %x, i8 %y) { 489*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test28a( 490*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 491*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = lshr i8 %x, 7 492*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[COND1:%.*]] = icmp eq i8 [[TMP1]], 0 493*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 [[COND1]], label %bb2, label %bb1 494*9880d681SAndroid Build Coastguard Worker; CHECK: bb1: 495*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[TMP1]] 496*9880d681SAndroid Build Coastguard Worker; CHECK: bb2: 497*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = add i8 [[TMP1]], %y 498*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[TMP2]] 499*9880d681SAndroid Build Coastguard Worker; 500*9880d681SAndroid Build Coastguard Workerentry: 501*9880d681SAndroid Build Coastguard Worker; This shouldn't be transformed. 502*9880d681SAndroid Build Coastguard Worker %tmp1 = lshr i8 %x, 7 503*9880d681SAndroid Build Coastguard Worker %cond1 = icmp ne i8 %tmp1, 0 504*9880d681SAndroid Build Coastguard Worker br i1 %cond1, label %bb1, label %bb2 505*9880d681SAndroid Build Coastguard Workerbb1: 506*9880d681SAndroid Build Coastguard Worker ret i8 %tmp1 507*9880d681SAndroid Build Coastguard Workerbb2: 508*9880d681SAndroid Build Coastguard Worker %tmp2 = add i8 %tmp1, %y 509*9880d681SAndroid Build Coastguard Worker ret i8 %tmp2 510*9880d681SAndroid Build Coastguard Worker} 511*9880d681SAndroid Build Coastguard Worker 512*9880d681SAndroid Build Coastguard Worker 513*9880d681SAndroid Build Coastguard Workerdefine i32 @test29(i64 %d18) { 514*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test29( 515*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 516*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP916:%.*]] = lshr i64 %d18, 63 517*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP10:%.*]] = trunc i64 [[TMP916]] to i32 518*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[TMP10]] 519*9880d681SAndroid Build Coastguard Worker; 520*9880d681SAndroid Build Coastguard Workerentry: 521*9880d681SAndroid Build Coastguard Worker %tmp916 = lshr i64 %d18, 32 522*9880d681SAndroid Build Coastguard Worker %tmp917 = trunc i64 %tmp916 to i32 523*9880d681SAndroid Build Coastguard Worker %tmp10 = lshr i32 %tmp917, 31 524*9880d681SAndroid Build Coastguard Worker ret i32 %tmp10 525*9880d681SAndroid Build Coastguard Worker} 526*9880d681SAndroid Build Coastguard Worker 527*9880d681SAndroid Build Coastguard Worker 528*9880d681SAndroid Build Coastguard Workerdefine i32 @test30(i32 %A, i32 %B, i32 %C) { 529*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test30( 530*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[X1:%.*]] = and i32 %A, %B 531*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = shl i32 [[X1]], %C 532*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Z]] 533*9880d681SAndroid Build Coastguard Worker; 534*9880d681SAndroid Build Coastguard Worker %X = shl i32 %A, %C 535*9880d681SAndroid Build Coastguard Worker %Y = shl i32 %B, %C 536*9880d681SAndroid Build Coastguard Worker %Z = and i32 %X, %Y 537*9880d681SAndroid Build Coastguard Worker ret i32 %Z 538*9880d681SAndroid Build Coastguard Worker} 539*9880d681SAndroid Build Coastguard Worker 540*9880d681SAndroid Build Coastguard Workerdefine i32 @test31(i32 %A, i32 %B, i32 %C) { 541*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test31( 542*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[X1:%.*]] = or i32 %A, %B 543*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = lshr i32 [[X1]], %C 544*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Z]] 545*9880d681SAndroid Build Coastguard Worker; 546*9880d681SAndroid Build Coastguard Worker %X = lshr i32 %A, %C 547*9880d681SAndroid Build Coastguard Worker %Y = lshr i32 %B, %C 548*9880d681SAndroid Build Coastguard Worker %Z = or i32 %X, %Y 549*9880d681SAndroid Build Coastguard Worker ret i32 %Z 550*9880d681SAndroid Build Coastguard Worker} 551*9880d681SAndroid Build Coastguard Worker 552*9880d681SAndroid Build Coastguard Workerdefine i32 @test32(i32 %A, i32 %B, i32 %C) { 553*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test32( 554*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[X1:%.*]] = xor i32 %A, %B 555*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = ashr i32 [[X1]], %C 556*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Z]] 557*9880d681SAndroid Build Coastguard Worker; 558*9880d681SAndroid Build Coastguard Worker %X = ashr i32 %A, %C 559*9880d681SAndroid Build Coastguard Worker %Y = ashr i32 %B, %C 560*9880d681SAndroid Build Coastguard Worker %Z = xor i32 %X, %Y 561*9880d681SAndroid Build Coastguard Worker ret i32 %Z 562*9880d681SAndroid Build Coastguard Worker} 563*9880d681SAndroid Build Coastguard Worker 564*9880d681SAndroid Build Coastguard Workerdefine i1 @test33(i32 %X) { 565*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test33( 566*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1_MASK:%.*]] = and i32 %X, 16777216 567*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1_MASK]], 0 568*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP2]] 569*9880d681SAndroid Build Coastguard Worker; 570*9880d681SAndroid Build Coastguard Worker %tmp1 = shl i32 %X, 7 571*9880d681SAndroid Build Coastguard Worker %tmp2 = icmp slt i32 %tmp1, 0 572*9880d681SAndroid Build Coastguard Worker ret i1 %tmp2 573*9880d681SAndroid Build Coastguard Worker} 574*9880d681SAndroid Build Coastguard Worker 575*9880d681SAndroid Build Coastguard Workerdefine i1 @test34(i32 %X) { 576*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test34( 577*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 578*9880d681SAndroid Build Coastguard Worker; 579*9880d681SAndroid Build Coastguard Worker %tmp1 = lshr i32 %X, 7 580*9880d681SAndroid Build Coastguard Worker %tmp2 = icmp slt i32 %tmp1, 0 581*9880d681SAndroid Build Coastguard Worker ret i1 %tmp2 582*9880d681SAndroid Build Coastguard Worker} 583*9880d681SAndroid Build Coastguard Worker 584*9880d681SAndroid Build Coastguard Workerdefine i1 @test35(i32 %X) { 585*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test35( 586*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 %X, 0 587*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP2]] 588*9880d681SAndroid Build Coastguard Worker; 589*9880d681SAndroid Build Coastguard Worker %tmp1 = ashr i32 %X, 7 590*9880d681SAndroid Build Coastguard Worker %tmp2 = icmp slt i32 %tmp1, 0 591*9880d681SAndroid Build Coastguard Worker ret i1 %tmp2 592*9880d681SAndroid Build Coastguard Worker} 593*9880d681SAndroid Build Coastguard Worker 594*9880d681SAndroid Build Coastguard Workerdefine i128 @test36(i128 %A, i128 %B) { 595*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test36( 596*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 597*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP231:%.*]] = or i128 %B, %A 598*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[INS:%.*]] = and i128 [[TMP231]], 18446744073709551615 599*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i128 [[INS]] 600*9880d681SAndroid Build Coastguard Worker; 601*9880d681SAndroid Build Coastguard Workerentry: 602*9880d681SAndroid Build Coastguard Worker %tmp27 = shl i128 %A, 64 603*9880d681SAndroid Build Coastguard Worker %tmp23 = shl i128 %B, 64 604*9880d681SAndroid Build Coastguard Worker %ins = or i128 %tmp23, %tmp27 605*9880d681SAndroid Build Coastguard Worker %tmp45 = lshr i128 %ins, 64 606*9880d681SAndroid Build Coastguard Worker ret i128 %tmp45 607*9880d681SAndroid Build Coastguard Worker 608*9880d681SAndroid Build Coastguard Worker} 609*9880d681SAndroid Build Coastguard Worker 610*9880d681SAndroid Build Coastguard Workerdefine i64 @test37(i128 %A, i32 %B) { 611*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test37( 612*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 613*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP22:%.*]] = zext i32 %B to i128 614*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP23:%.*]] = shl nuw nsw i128 [[TMP22]], 32 615*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[INS:%.*]] = or i128 [[TMP23]], %A 616*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP46:%.*]] = trunc i128 [[INS]] to i64 617*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[TMP46]] 618*9880d681SAndroid Build Coastguard Worker; 619*9880d681SAndroid Build Coastguard Workerentry: 620*9880d681SAndroid Build Coastguard Worker %tmp27 = shl i128 %A, 64 621*9880d681SAndroid Build Coastguard Worker %tmp22 = zext i32 %B to i128 622*9880d681SAndroid Build Coastguard Worker %tmp23 = shl i128 %tmp22, 96 623*9880d681SAndroid Build Coastguard Worker %ins = or i128 %tmp23, %tmp27 624*9880d681SAndroid Build Coastguard Worker %tmp45 = lshr i128 %ins, 64 625*9880d681SAndroid Build Coastguard Worker %tmp46 = trunc i128 %tmp45 to i64 626*9880d681SAndroid Build Coastguard Worker ret i64 %tmp46 627*9880d681SAndroid Build Coastguard Worker 628*9880d681SAndroid Build Coastguard Worker} 629*9880d681SAndroid Build Coastguard Worker 630*9880d681SAndroid Build Coastguard Workerdefine i32 @test38(i32 %x) nounwind readnone { 631*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test38( 632*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[REM1:%.*]] = and i32 %x, 31 633*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = shl i32 1, [[REM1]] 634*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[SHL]] 635*9880d681SAndroid Build Coastguard Worker; 636*9880d681SAndroid Build Coastguard Worker %rem = srem i32 %x, 32 637*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %rem 638*9880d681SAndroid Build Coastguard Worker ret i32 %shl 639*9880d681SAndroid Build Coastguard Worker} 640*9880d681SAndroid Build Coastguard Worker 641*9880d681SAndroid Build Coastguard Worker; <rdar://problem/8756731> 642*9880d681SAndroid Build Coastguard Workerdefine i8 @test39(i32 %a0) { 643*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test39( 644*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 645*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP4:%.*]] = trunc i32 %a0 to i8 646*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP5:%.*]] = shl i8 [[TMP4]], 5 647*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP49:%.*]] = shl i8 [[TMP4]], 6 648*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP50:%.*]] = and i8 [[TMP49]], 64 649*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP51:%.*]] = xor i8 [[TMP50]], [[TMP5]] 650*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP0:%.*]] = shl i8 [[TMP4]], 2 651*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP54:%.*]] = and i8 [[TMP0]], 16 652*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP551:%.*]] = or i8 [[TMP54]], [[TMP51]] 653*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[TMP551]] 654*9880d681SAndroid Build Coastguard Worker; 655*9880d681SAndroid Build Coastguard Workerentry: 656*9880d681SAndroid Build Coastguard Worker %tmp4 = trunc i32 %a0 to i8 657*9880d681SAndroid Build Coastguard Worker %tmp5 = shl i8 %tmp4, 5 658*9880d681SAndroid Build Coastguard Worker %tmp48 = and i8 %tmp5, 32 659*9880d681SAndroid Build Coastguard Worker %tmp49 = lshr i8 %tmp48, 5 660*9880d681SAndroid Build Coastguard Worker %tmp50 = mul i8 %tmp49, 64 661*9880d681SAndroid Build Coastguard Worker %tmp51 = xor i8 %tmp50, %tmp5 662*9880d681SAndroid Build Coastguard Worker %tmp52 = and i8 %tmp51, -128 663*9880d681SAndroid Build Coastguard Worker %tmp53 = lshr i8 %tmp52, 7 664*9880d681SAndroid Build Coastguard Worker %tmp54 = mul i8 %tmp53, 16 665*9880d681SAndroid Build Coastguard Worker %tmp55 = xor i8 %tmp54, %tmp51 666*9880d681SAndroid Build Coastguard Worker ret i8 %tmp55 667*9880d681SAndroid Build Coastguard Worker} 668*9880d681SAndroid Build Coastguard Worker 669*9880d681SAndroid Build Coastguard Worker; PR9809 670*9880d681SAndroid Build Coastguard Workerdefine i32 @test40(i32 %a, i32 %b) nounwind { 671*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test40( 672*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = add i32 %b, 2 673*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[DIV:%.*]] = lshr i32 %a, [[TMP1]] 674*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[DIV]] 675*9880d681SAndroid Build Coastguard Worker; 676*9880d681SAndroid Build Coastguard Worker %shl1 = shl i32 1, %b 677*9880d681SAndroid Build Coastguard Worker %shl2 = shl i32 %shl1, 2 678*9880d681SAndroid Build Coastguard Worker %div = udiv i32 %a, %shl2 679*9880d681SAndroid Build Coastguard Worker ret i32 %div 680*9880d681SAndroid Build Coastguard Worker} 681*9880d681SAndroid Build Coastguard Worker 682*9880d681SAndroid Build Coastguard Workerdefine i32 @test41(i32 %a, i32 %b) nounwind { 683*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test41( 684*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shl i32 8, %b 685*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[TMP1]] 686*9880d681SAndroid Build Coastguard Worker; 687*9880d681SAndroid Build Coastguard Worker %1 = shl i32 1, %b 688*9880d681SAndroid Build Coastguard Worker %2 = shl i32 %1, 3 689*9880d681SAndroid Build Coastguard Worker ret i32 %2 690*9880d681SAndroid Build Coastguard Worker} 691*9880d681SAndroid Build Coastguard Worker 692*9880d681SAndroid Build Coastguard Workerdefine i32 @test42(i32 %a, i32 %b) nounwind { 693*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test42( 694*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[DIV:%.*]] = lshr exact i32 4096, %b 695*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[DIV2:%.*]] = udiv i32 %a, [[DIV]] 696*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[DIV2]] 697*9880d681SAndroid Build Coastguard Worker; 698*9880d681SAndroid Build Coastguard Worker %div = lshr i32 4096, %b ; must be exact otherwise we'd divide by zero 699*9880d681SAndroid Build Coastguard Worker %div2 = udiv i32 %a, %div 700*9880d681SAndroid Build Coastguard Worker ret i32 %div2 701*9880d681SAndroid Build Coastguard Worker} 702*9880d681SAndroid Build Coastguard Worker 703*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test42vec(<2 x i32> %a, <2 x i32> %b) { 704*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test42vec( 705*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[DIV:%.*]] = lshr exact <2 x i32> <i32 4096, i32 4096>, %b 706*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[DIV2:%.*]] = udiv <2 x i32> %a, [[DIV]] 707*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i32> [[DIV2]] 708*9880d681SAndroid Build Coastguard Worker; 709*9880d681SAndroid Build Coastguard Worker %div = lshr <2 x i32> <i32 4096, i32 4096>, %b ; must be exact otherwise we'd divide by zero 710*9880d681SAndroid Build Coastguard Worker %div2 = udiv <2 x i32> %a, %div 711*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %div2 712*9880d681SAndroid Build Coastguard Worker} 713*9880d681SAndroid Build Coastguard Worker 714*9880d681SAndroid Build Coastguard Workerdefine i32 @test43(i32 %a, i32 %b) nounwind { 715*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test43( 716*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = add i32 %b, 12 717*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[DIV2:%.*]] = lshr i32 %a, [[TMP1]] 718*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[DIV2]] 719*9880d681SAndroid Build Coastguard Worker; 720*9880d681SAndroid Build Coastguard Worker %div = shl i32 4096, %b ; must be exact otherwise we'd divide by zero 721*9880d681SAndroid Build Coastguard Worker %div2 = udiv i32 %a, %div 722*9880d681SAndroid Build Coastguard Worker ret i32 %div2 723*9880d681SAndroid Build Coastguard Worker} 724*9880d681SAndroid Build Coastguard Worker 725*9880d681SAndroid Build Coastguard Workerdefine i32 @test44(i32 %a) nounwind { 726*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test44( 727*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y:%.*]] = shl i32 %a, 5 728*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Y]] 729*9880d681SAndroid Build Coastguard Worker; 730*9880d681SAndroid Build Coastguard Worker %y = shl nuw i32 %a, 1 731*9880d681SAndroid Build Coastguard Worker %z = shl i32 %y, 4 732*9880d681SAndroid Build Coastguard Worker ret i32 %z 733*9880d681SAndroid Build Coastguard Worker} 734*9880d681SAndroid Build Coastguard Worker 735*9880d681SAndroid Build Coastguard Workerdefine i32 @test45(i32 %a) nounwind { 736*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test45( 737*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y:%.*]] = lshr i32 %a, 5 738*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Y]] 739*9880d681SAndroid Build Coastguard Worker; 740*9880d681SAndroid Build Coastguard Worker %y = lshr exact i32 %a, 1 741*9880d681SAndroid Build Coastguard Worker %z = lshr i32 %y, 4 742*9880d681SAndroid Build Coastguard Worker ret i32 %z 743*9880d681SAndroid Build Coastguard Worker} 744*9880d681SAndroid Build Coastguard Worker 745*9880d681SAndroid Build Coastguard Workerdefine i32 @test46(i32 %a) { 746*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test46( 747*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = ashr exact i32 %a, 2 748*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Z]] 749*9880d681SAndroid Build Coastguard Worker; 750*9880d681SAndroid Build Coastguard Worker %y = ashr exact i32 %a, 3 751*9880d681SAndroid Build Coastguard Worker %z = shl i32 %y, 1 752*9880d681SAndroid Build Coastguard Worker ret i32 %z 753*9880d681SAndroid Build Coastguard Worker} 754*9880d681SAndroid Build Coastguard Worker 755*9880d681SAndroid Build Coastguard Workerdefine i32 @test47(i32 %a) { 756*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test47( 757*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = lshr exact i32 %a, 2 758*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Z]] 759*9880d681SAndroid Build Coastguard Worker; 760*9880d681SAndroid Build Coastguard Worker %y = lshr exact i32 %a, 3 761*9880d681SAndroid Build Coastguard Worker %z = shl i32 %y, 1 762*9880d681SAndroid Build Coastguard Worker ret i32 %z 763*9880d681SAndroid Build Coastguard Worker} 764*9880d681SAndroid Build Coastguard Worker 765*9880d681SAndroid Build Coastguard Workerdefine i32 @test48(i32 %x) { 766*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test48( 767*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = shl i32 %x, 2 768*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[B]] 769*9880d681SAndroid Build Coastguard Worker; 770*9880d681SAndroid Build Coastguard Worker %A = lshr exact i32 %x, 1 771*9880d681SAndroid Build Coastguard Worker %B = shl i32 %A, 3 772*9880d681SAndroid Build Coastguard Worker ret i32 %B 773*9880d681SAndroid Build Coastguard Worker} 774*9880d681SAndroid Build Coastguard Worker 775*9880d681SAndroid Build Coastguard Workerdefine i32 @test49(i32 %x) { 776*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test49( 777*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = shl i32 %x, 2 778*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[B]] 779*9880d681SAndroid Build Coastguard Worker; 780*9880d681SAndroid Build Coastguard Worker %A = ashr exact i32 %x, 1 781*9880d681SAndroid Build Coastguard Worker %B = shl i32 %A, 3 782*9880d681SAndroid Build Coastguard Worker ret i32 %B 783*9880d681SAndroid Build Coastguard Worker} 784*9880d681SAndroid Build Coastguard Worker 785*9880d681SAndroid Build Coastguard Workerdefine i32 @test50(i32 %x) { 786*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test50( 787*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = ashr i32 %x, 2 788*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[B]] 789*9880d681SAndroid Build Coastguard Worker; 790*9880d681SAndroid Build Coastguard Worker %A = shl nsw i32 %x, 1 791*9880d681SAndroid Build Coastguard Worker %B = ashr i32 %A, 3 792*9880d681SAndroid Build Coastguard Worker ret i32 %B 793*9880d681SAndroid Build Coastguard Worker} 794*9880d681SAndroid Build Coastguard Worker 795*9880d681SAndroid Build Coastguard Workerdefine i32 @test51(i32 %x) { 796*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test51( 797*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = lshr i32 %x, 2 798*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[B]] 799*9880d681SAndroid Build Coastguard Worker; 800*9880d681SAndroid Build Coastguard Worker %A = shl nuw i32 %x, 1 801*9880d681SAndroid Build Coastguard Worker %B = lshr i32 %A, 3 802*9880d681SAndroid Build Coastguard Worker ret i32 %B 803*9880d681SAndroid Build Coastguard Worker} 804*9880d681SAndroid Build Coastguard Worker 805*9880d681SAndroid Build Coastguard Workerdefine i32 @test52(i32 %x) { 806*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test52( 807*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = shl nsw i32 %x, 2 808*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[B]] 809*9880d681SAndroid Build Coastguard Worker; 810*9880d681SAndroid Build Coastguard Worker %A = shl nsw i32 %x, 3 811*9880d681SAndroid Build Coastguard Worker %B = ashr i32 %A, 1 812*9880d681SAndroid Build Coastguard Worker ret i32 %B 813*9880d681SAndroid Build Coastguard Worker} 814*9880d681SAndroid Build Coastguard Worker 815*9880d681SAndroid Build Coastguard Workerdefine i32 @test53(i32 %x) { 816*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test53( 817*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = shl nuw i32 %x, 2 818*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[B]] 819*9880d681SAndroid Build Coastguard Worker; 820*9880d681SAndroid Build Coastguard Worker %A = shl nuw i32 %x, 3 821*9880d681SAndroid Build Coastguard Worker %B = lshr i32 %A, 1 822*9880d681SAndroid Build Coastguard Worker ret i32 %B 823*9880d681SAndroid Build Coastguard Worker} 824*9880d681SAndroid Build Coastguard Worker 825*9880d681SAndroid Build Coastguard Workerdefine i32 @test54(i32 %x) { 826*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test54( 827*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shl i32 %x, 3 828*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 [[TMP1]], 16 829*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[AND]] 830*9880d681SAndroid Build Coastguard Worker; 831*9880d681SAndroid Build Coastguard Worker %shr2 = lshr i32 %x, 1 832*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %shr2, 4 833*9880d681SAndroid Build Coastguard Worker %and = and i32 %shl, 16 834*9880d681SAndroid Build Coastguard Worker ret i32 %and 835*9880d681SAndroid Build Coastguard Worker} 836*9880d681SAndroid Build Coastguard Worker 837*9880d681SAndroid Build Coastguard Worker 838*9880d681SAndroid Build Coastguard Workerdefine i32 @test55(i32 %x) { 839*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test55( 840*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shl i32 %x, 3 841*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = or i32 [[TMP1]], 8 842*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 843*9880d681SAndroid Build Coastguard Worker; 844*9880d681SAndroid Build Coastguard Worker %shr2 = lshr i32 %x, 1 845*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %shr2, 4 846*9880d681SAndroid Build Coastguard Worker %or = or i32 %shl, 8 847*9880d681SAndroid Build Coastguard Worker ret i32 %or 848*9880d681SAndroid Build Coastguard Worker} 849*9880d681SAndroid Build Coastguard Worker 850*9880d681SAndroid Build Coastguard Workerdefine i32 @test56(i32 %x) { 851*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test56( 852*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHR2:%.*]] = lshr i32 %x, 1 853*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[SHR2]], 4 854*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = or i32 [[SHL]], 7 855*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 856*9880d681SAndroid Build Coastguard Worker; 857*9880d681SAndroid Build Coastguard Worker %shr2 = lshr i32 %x, 1 858*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %shr2, 4 859*9880d681SAndroid Build Coastguard Worker %or = or i32 %shl, 7 860*9880d681SAndroid Build Coastguard Worker ret i32 %or 861*9880d681SAndroid Build Coastguard Worker} 862*9880d681SAndroid Build Coastguard Worker 863*9880d681SAndroid Build Coastguard Worker 864*9880d681SAndroid Build Coastguard Workerdefine i32 @test57(i32 %x) { 865*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test57( 866*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHR1:%.*]] = lshr i32 %x, 1 867*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[SHR1]], 4 868*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = or i32 [[SHL]], 7 869*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 870*9880d681SAndroid Build Coastguard Worker; 871*9880d681SAndroid Build Coastguard Worker %shr = ashr i32 %x, 1 872*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %shr, 4 873*9880d681SAndroid Build Coastguard Worker %or = or i32 %shl, 7 874*9880d681SAndroid Build Coastguard Worker ret i32 %or 875*9880d681SAndroid Build Coastguard Worker} 876*9880d681SAndroid Build Coastguard Worker 877*9880d681SAndroid Build Coastguard Worker 878*9880d681SAndroid Build Coastguard Workerdefine i32 @test58(i32 %x) { 879*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test58( 880*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = ashr i32 %x, 3 881*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = or i32 [[TMP1]], 1 882*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 883*9880d681SAndroid Build Coastguard Worker; 884*9880d681SAndroid Build Coastguard Worker %shr = ashr i32 %x, 4 885*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %shr, 1 886*9880d681SAndroid Build Coastguard Worker %or = or i32 %shl, 1 887*9880d681SAndroid Build Coastguard Worker ret i32 %or 888*9880d681SAndroid Build Coastguard Worker} 889*9880d681SAndroid Build Coastguard Worker 890*9880d681SAndroid Build Coastguard Worker 891*9880d681SAndroid Build Coastguard Workerdefine i32 @test59(i32 %x) { 892*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test59( 893*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHR:%.*]] = ashr i32 %x, 4 894*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = shl nsw i32 [[SHR]], 1 895*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = or i32 [[SHL]], 2 896*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 897*9880d681SAndroid Build Coastguard Worker; 898*9880d681SAndroid Build Coastguard Worker %shr = ashr i32 %x, 4 899*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %shr, 1 900*9880d681SAndroid Build Coastguard Worker %or = or i32 %shl, 2 901*9880d681SAndroid Build Coastguard Worker ret i32 %or 902*9880d681SAndroid Build Coastguard Worker} 903*9880d681SAndroid Build Coastguard Worker 904*9880d681SAndroid Build Coastguard Worker; propagate "exact" trait 905*9880d681SAndroid Build Coastguard Workerdefine i32 @test60(i32 %x) { 906*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test60( 907*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = ashr exact i32 %x, 3 908*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = or i32 [[SHL]], 1 909*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 910*9880d681SAndroid Build Coastguard Worker; 911*9880d681SAndroid Build Coastguard Worker %shr = ashr exact i32 %x, 4 912*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %shr, 1 913*9880d681SAndroid Build Coastguard Worker %or = or i32 %shl, 1 914*9880d681SAndroid Build Coastguard Worker ret i32 %or 915*9880d681SAndroid Build Coastguard Worker} 916*9880d681SAndroid Build Coastguard Worker 917*9880d681SAndroid Build Coastguard Worker; PR17026 918*9880d681SAndroid Build Coastguard Workerdefine void @test61(i128 %arg) { 919*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test61( 920*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bb: 921*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 undef, label %bb1, label %bb12 922*9880d681SAndroid Build Coastguard Worker; CHECK: bb1: 923*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %bb2 924*9880d681SAndroid Build Coastguard Worker; CHECK: bb2: 925*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 undef, label %bb3, label %bb7 926*9880d681SAndroid Build Coastguard Worker; CHECK: bb3: 927*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %bb8 928*9880d681SAndroid Build Coastguard Worker; CHECK: bb7: 929*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 undef, label %bb8, label %bb2 930*9880d681SAndroid Build Coastguard Worker; CHECK: bb8: 931*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 undef, label %bb11, label %bb12 932*9880d681SAndroid Build Coastguard Worker; CHECK: bb11: 933*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 undef, label %bb1, label %bb12 934*9880d681SAndroid Build Coastguard Worker; CHECK: bb12: 935*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 936*9880d681SAndroid Build Coastguard Worker; 937*9880d681SAndroid Build Coastguard Workerbb: 938*9880d681SAndroid Build Coastguard Worker br i1 undef, label %bb1, label %bb12 939*9880d681SAndroid Build Coastguard Worker 940*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %bb11, %bb 941*9880d681SAndroid Build Coastguard Worker br label %bb2 942*9880d681SAndroid Build Coastguard Worker 943*9880d681SAndroid Build Coastguard Workerbb2: ; preds = %bb7, %bb1 944*9880d681SAndroid Build Coastguard Worker br i1 undef, label %bb3, label %bb7 945*9880d681SAndroid Build Coastguard Worker 946*9880d681SAndroid Build Coastguard Workerbb3: ; preds = %bb2 947*9880d681SAndroid Build Coastguard Worker %tmp = lshr i128 %arg, 36893488147419103232 948*9880d681SAndroid Build Coastguard Worker %tmp4 = shl i128 %tmp, 0 949*9880d681SAndroid Build Coastguard Worker %tmp5 = or i128 %tmp4, undef 950*9880d681SAndroid Build Coastguard Worker %tmp6 = trunc i128 %tmp5 to i16 951*9880d681SAndroid Build Coastguard Worker br label %bb8 952*9880d681SAndroid Build Coastguard Worker 953*9880d681SAndroid Build Coastguard Workerbb7: ; preds = %bb2 954*9880d681SAndroid Build Coastguard Worker br i1 undef, label %bb8, label %bb2 955*9880d681SAndroid Build Coastguard Worker 956*9880d681SAndroid Build Coastguard Workerbb8: ; preds = %bb7, %bb3 957*9880d681SAndroid Build Coastguard Worker %tmp9 = phi i16 [ %tmp6, %bb3 ], [ undef, %bb7 ] 958*9880d681SAndroid Build Coastguard Worker %tmp10 = icmp eq i16 %tmp9, 0 959*9880d681SAndroid Build Coastguard Worker br i1 %tmp10, label %bb11, label %bb12 960*9880d681SAndroid Build Coastguard Worker 961*9880d681SAndroid Build Coastguard Workerbb11: ; preds = %bb8 962*9880d681SAndroid Build Coastguard Worker br i1 undef, label %bb1, label %bb12 963*9880d681SAndroid Build Coastguard Worker 964*9880d681SAndroid Build Coastguard Workerbb12: ; preds = %bb11, %bb8, %bb 965*9880d681SAndroid Build Coastguard Worker ret void 966*9880d681SAndroid Build Coastguard Worker} 967*9880d681SAndroid Build Coastguard Worker 968*9880d681SAndroid Build Coastguard Workerdefine i32 @test62(i32 %a) { 969*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test62( 970*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 undef 971*9880d681SAndroid Build Coastguard Worker; 972*9880d681SAndroid Build Coastguard Worker %b = ashr i32 %a, 32 ; shift all bits out 973*9880d681SAndroid Build Coastguard Worker ret i32 %b 974*9880d681SAndroid Build Coastguard Worker} 975*9880d681SAndroid Build Coastguard Worker 976*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test62_splat_vector(<4 x i32> %a) { 977*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test62_splat_vector( 978*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> undef 979*9880d681SAndroid Build Coastguard Worker; 980*9880d681SAndroid Build Coastguard Worker %b = ashr <4 x i32> %a, <i32 32, i32 32, i32 32, i32 32> ; shift all bits out 981*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %b 982*9880d681SAndroid Build Coastguard Worker} 983*9880d681SAndroid Build Coastguard Worker 984*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test62_non_splat_vector(<4 x i32> %a) { 985*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test62_non_splat_vector( 986*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = ashr <4 x i32> %a, <i32 32, i32 0, i32 1, i32 2> 987*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> [[B]] 988*9880d681SAndroid Build Coastguard Worker; 989*9880d681SAndroid Build Coastguard Worker %b = ashr <4 x i32> %a, <i32 32, i32 0, i32 1, i32 2> ; shift all bits out 990*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %b 991*9880d681SAndroid Build Coastguard Worker} 992*9880d681SAndroid Build Coastguard Worker 993*9880d681SAndroid Build Coastguard Workerdefine <2 x i65> @test_63(<2 x i64> %t) { 994*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_63( 995*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A:%.*]] = zext <2 x i64> %t to <2 x i65> 996*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEXT:%.*]] = shl <2 x i65> [[A]], <i65 33, i65 33> 997*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = ashr <2 x i65> [[SEXT]], <i65 33, i65 33> 998*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i65> [[B]] 999*9880d681SAndroid Build Coastguard Worker; 1000*9880d681SAndroid Build Coastguard Worker %a = zext <2 x i64> %t to <2 x i65> 1001*9880d681SAndroid Build Coastguard Worker %sext = shl <2 x i65> %a, <i65 33, i65 33> 1002*9880d681SAndroid Build Coastguard Worker %b = ashr <2 x i65> %sext, <i65 33, i65 33> 1003*9880d681SAndroid Build Coastguard Worker ret <2 x i65> %b 1004*9880d681SAndroid Build Coastguard Worker} 1005