670 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4declare void @use(i8)5 6define i8 @lshr_add(i8 %a, i8 %y) {7; CHECK-LABEL: @lshr_add(8; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 429; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 510; CHECK-NEXT: [[R2:%.*]] = add i8 [[Y:%.*]], [[B1]]11; CHECK-NEXT: [[L:%.*]] = and i8 [[R2]], -3212; CHECK-NEXT: ret i8 [[L]]13;14 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization15 %r = lshr i8 %y, 516 %b = add i8 %r, %x17 %l = shl i8 %b, 518 ret i8 %l19}20 21define <2 x i8> @lshr_add_commute_splat(<2 x i8> %a, <2 x i8> %y) {22; CHECK-LABEL: @lshr_add_commute_splat(23; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)24; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 5)25; CHECK-NEXT: [[R2:%.*]] = add <2 x i8> [[Y:%.*]], [[B1]]26; CHECK-NEXT: [[L:%.*]] = and <2 x i8> [[R2]], splat (i8 -32)27; CHECK-NEXT: ret <2 x i8> [[L]]28;29 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization30 %r = lshr <2 x i8> %y, <i8 5, i8 5>31 %b = add <2 x i8> %x, %r32 %l = shl <2 x i8> %b, <i8 5, i8 5>33 ret <2 x i8> %l34}35 36define i8 @lshr_sub(i8 %a, i8 %y) {37; CHECK-LABEL: @lshr_sub(38; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 4239; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 340; CHECK-NEXT: [[B:%.*]] = sub nsw i8 [[X]], [[R]]41; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 342; CHECK-NEXT: ret i8 [[L]]43;44 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization45 %r = lshr i8 %y, 346 %b = sub i8 %x, %r47 %l = shl i8 %b, 348 ret i8 %l49}50 51define <2 x i8> @lshr_sub_commute_splat(<2 x i8> %a, <2 x i8> %y) {52; CHECK-LABEL: @lshr_sub_commute_splat(53; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)54; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 3)55; CHECK-NEXT: [[R2:%.*]] = sub <2 x i8> [[Y:%.*]], [[B1]]56; CHECK-NEXT: [[L:%.*]] = and <2 x i8> [[R2]], splat (i8 -8)57; CHECK-NEXT: ret <2 x i8> [[L]]58;59 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization60 %r = lshr <2 x i8> %y, <i8 3, i8 3>61 %b = sub <2 x i8> %r, %x62 %l = shl <2 x i8> %b, <i8 3, i8 3>63 ret <2 x i8> %l64}65 66define i8 @lshr_and(i8 %a, i8 %y) {67; CHECK-LABEL: @lshr_and(68; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 4269; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 670; CHECK-NEXT: [[R2:%.*]] = and i8 [[Y:%.*]], [[B1]]71; CHECK-NEXT: ret i8 [[R2]]72;73 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization74 %r = lshr i8 %y, 675 %b = and i8 %r, %x76 %l = shl i8 %b, 677 ret i8 %l78}79 80define <2 x i8> @lshr_and_commute_splat(<2 x i8> %a, <2 x i8> %y) {81; CHECK-LABEL: @lshr_and_commute_splat(82; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)83; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 6)84; CHECK-NEXT: [[R2:%.*]] = and <2 x i8> [[Y:%.*]], [[B1]]85; CHECK-NEXT: ret <2 x i8> [[R2]]86;87 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization88 %r = lshr <2 x i8> %y, <i8 6, i8 6>89 %b = and <2 x i8> %x, %r90 %l = shl <2 x i8> %b, <i8 6, i8 6>91 ret <2 x i8> %l92}93 94define i8 @lshr_or(i8 %a, i8 %y) {95; CHECK-LABEL: @lshr_or(96; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 4297; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 498; CHECK-NEXT: [[Y_MASKED:%.*]] = and i8 [[Y:%.*]], -1699; CHECK-NEXT: [[L:%.*]] = or i8 [[Y_MASKED]], [[B1]]100; CHECK-NEXT: ret i8 [[L]]101;102 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization103 %r = lshr i8 %y, 4104 %b = or i8 %x, %r105 %l = shl i8 %b, 4106 ret i8 %l107}108 109define <2 x i8> @lshr_or_commute_splat(<2 x i8> %a, <2 x i8> %y) {110; CHECK-LABEL: @lshr_or_commute_splat(111; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)112; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 4)113; CHECK-NEXT: [[Y_MASKED:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 -16)114; CHECK-NEXT: [[L:%.*]] = or <2 x i8> [[Y_MASKED]], [[B1]]115; CHECK-NEXT: ret <2 x i8> [[L]]116;117 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization118 %r = lshr <2 x i8> %y, <i8 4, i8 4>119 %b = or <2 x i8> %r, %x120 %l = shl <2 x i8> %b, <i8 4, i8 4>121 ret <2 x i8> %l122}123 124define i8 @lshr_xor(i8 %a, i8 %y) {125; CHECK-LABEL: @lshr_xor(126; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42127; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 3128; CHECK-NEXT: [[Y_MASKED:%.*]] = and i8 [[Y:%.*]], -8129; CHECK-NEXT: [[L:%.*]] = xor i8 [[Y_MASKED]], [[B1]]130; CHECK-NEXT: ret i8 [[L]]131;132 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization133 %r = lshr i8 %y, 3134 %b = xor i8 %r, %x135 %l = shl i8 %b, 3136 ret i8 %l137}138 139define <2 x i8> @lshr_xor_commute_splat(<2 x i8> %a, <2 x i8> %y) {140; CHECK-LABEL: @lshr_xor_commute_splat(141; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)142; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 3)143; CHECK-NEXT: [[Y_MASKED:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 -8)144; CHECK-NEXT: [[L:%.*]] = xor <2 x i8> [[Y_MASKED]], [[B1]]145; CHECK-NEXT: ret <2 x i8> [[L]]146;147 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization148 %r = lshr <2 x i8> %y, <i8 3, i8 3>149 %b = xor <2 x i8> %x, %r150 %l = shl <2 x i8> %b, <i8 3, i8 3>151 ret <2 x i8> %l152}153 154define i8 @lshr_add_use1(i8 %x, i8 %y) {155; CHECK-LABEL: @lshr_add_use1(156; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 5157; CHECK-NEXT: call void @use(i8 [[R]])158; CHECK-NEXT: [[B:%.*]] = add i8 [[R]], [[X:%.*]]159; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 5160; CHECK-NEXT: ret i8 [[L]]161;162 %r = lshr i8 %y, 5163 call void @use(i8 %r)164 %b = add i8 %r, %x165 %l = shl i8 %b, 5166 ret i8 %l167}168 169define i8 @lshr_add_use2(i8 %x, i8 %y) {170; CHECK-LABEL: @lshr_add_use2(171; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 5172; CHECK-NEXT: [[B:%.*]] = add i8 [[R]], [[X:%.*]]173; CHECK-NEXT: call void @use(i8 [[B]])174; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 5175; CHECK-NEXT: ret i8 [[L]]176;177 %r = lshr i8 %y, 5178 %b = add i8 %r, %x179 call void @use(i8 %b)180 %l = shl i8 %b, 5181 ret i8 %l182}183 184define i8 @lshr_and_add(i8 %a, i8 %y) {185; CHECK-LABEL: @lshr_and_add(186; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42187; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 3188; CHECK-NEXT: [[Y_MASK:%.*]] = and i8 [[Y:%.*]], 96189; CHECK-NEXT: [[L:%.*]] = add i8 [[Y_MASK]], [[B1]]190; CHECK-NEXT: ret i8 [[L]]191;192 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization193 %r = lshr i8 %y, 3194 %m = and i8 %r, 12195 %b = add i8 %x, %m196 %l = shl i8 %b, 3197 ret i8 %l198}199 200define <2 x i8> @lshr_and_add_commute_splat(<2 x i8> %a, <2 x i8> %y) {201; CHECK-LABEL: @lshr_and_add_commute_splat(202; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)203; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 3)204; CHECK-NEXT: [[Y_MASK:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 96)205; CHECK-NEXT: [[L:%.*]] = add <2 x i8> [[Y_MASK]], [[B1]]206; CHECK-NEXT: ret <2 x i8> [[L]]207;208 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization209 %r = lshr <2 x i8> %y, <i8 3, i8 3>210 %m = and <2 x i8> %r, <i8 12, i8 12>211 %b = add <2 x i8> %m, %x212 %l = shl <2 x i8> %b, <i8 3, i8 3>213 ret <2 x i8> %l214}215 216define i8 @lshr_and_sub(i8 %a, i8 %y) {217; CHECK-LABEL: @lshr_and_sub(218; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42219; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 2220; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 13221; CHECK-NEXT: [[B:%.*]] = sub nsw i8 [[X]], [[M]]222; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 2223; CHECK-NEXT: ret i8 [[L]]224;225 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization226 %r = lshr i8 %y, 2227 %m = and i8 %r, 13228 %b = sub i8 %x, %m229 %l = shl i8 %b, 2230 ret i8 %l231}232 233define <2 x i8> @lshr_and_sub_commute_splat(<2 x i8> %a, <2 x i8> %y) {234; CHECK-LABEL: @lshr_and_sub_commute_splat(235; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)236; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 2)237; CHECK-NEXT: [[Y_MASK:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 52)238; CHECK-NEXT: [[L:%.*]] = sub <2 x i8> [[Y_MASK]], [[B1]]239; CHECK-NEXT: ret <2 x i8> [[L]]240;241 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization242 %r = lshr <2 x i8> %y, <i8 2, i8 2>243 %m = and <2 x i8> %r, <i8 13, i8 13>244 %b = sub <2 x i8> %m, %x245 %l = shl <2 x i8> %b, <i8 2, i8 2>246 ret <2 x i8> %l247}248 249define i8 @lshr_and_and(i8 %a, i8 %y) {250; CHECK-LABEL: @lshr_and_and(251; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42252; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 2253; CHECK-NEXT: [[Y_MASK:%.*]] = and i8 [[Y:%.*]], 52254; CHECK-NEXT: [[L:%.*]] = and i8 [[Y_MASK]], [[B1]]255; CHECK-NEXT: ret i8 [[L]]256;257 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization258 %r = lshr i8 %y, 2259 %m = and i8 %r, 13260 %b = and i8 %m, %x261 %l = shl i8 %b, 2262 ret i8 %l263}264 265define <2 x i8> @lshr_and_and_commute_splat(<2 x i8> %a, <2 x i8> %y) {266; CHECK-LABEL: @lshr_and_and_commute_splat(267; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)268; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 2)269; CHECK-NEXT: [[Y_MASK:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 52)270; CHECK-NEXT: [[L:%.*]] = and <2 x i8> [[Y_MASK]], [[B1]]271; CHECK-NEXT: ret <2 x i8> [[L]]272;273 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization274 %r = lshr <2 x i8> %y, <i8 2, i8 2>275 %m = and <2 x i8> %r, <i8 13, i8 13>276 %b = and <2 x i8> %x, %m277 %l = shl <2 x i8> %b, <i8 2, i8 2>278 ret <2 x i8> %l279}280 281define i8 @lshr_and_or(i8 %a, i8 %y) {282; CHECK-LABEL: @lshr_and_or(283; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42284; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 2285; CHECK-NEXT: [[Y_MASK:%.*]] = and i8 [[Y:%.*]], 52286; CHECK-NEXT: [[L:%.*]] = or i8 [[Y_MASK]], [[B1]]287; CHECK-NEXT: ret i8 [[L]]288;289 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization290 %r = lshr i8 %y, 2291 %m = and i8 %r, 13292 %b = or i8 %x, %m293 %l = shl i8 %b, 2294 ret i8 %l295}296 297define i8 @lshr_and_or_disjoint(i8 %a, i8 %y) {298; CHECK-LABEL: @lshr_and_or_disjoint(299; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42300; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 2301; CHECK-NEXT: [[Y_MASK:%.*]] = and i8 [[Y:%.*]], 52302; CHECK-NEXT: [[L:%.*]] = or disjoint i8 [[Y_MASK]], [[B1]]303; CHECK-NEXT: ret i8 [[L]]304;305 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization306 %r = lshr i8 %y, 2307 %m = and i8 %r, 13308 %b = or disjoint i8 %x, %m309 %l = shl i8 %b, 2310 ret i8 %l311}312 313define i8 @ashr_and_or_disjoint(i8 %a, i8 %y) {314; CHECK-LABEL: @ashr_and_or_disjoint(315; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42316; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 2317; CHECK-NEXT: [[Y_MASK:%.*]] = and i8 [[Y:%.*]], 52318; CHECK-NEXT: [[L:%.*]] = or disjoint i8 [[Y_MASK]], [[B1]]319; CHECK-NEXT: ret i8 [[L]]320;321 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization322 %r = ashr i8 %y, 2323 %m = and i8 %r, 13324 %b = or disjoint i8 %x, %m325 %l = shl i8 %b, 2326 ret i8 %l327}328 329 330define <2 x i8> @lshr_and_or_commute_splat(<2 x i8> %a, <2 x i8> %y) {331; CHECK-LABEL: @lshr_and_or_commute_splat(332; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)333; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 2)334; CHECK-NEXT: [[Y_MASK:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 52)335; CHECK-NEXT: [[L:%.*]] = or <2 x i8> [[Y_MASK]], [[B1]]336; CHECK-NEXT: ret <2 x i8> [[L]]337;338 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization339 %r = lshr <2 x i8> %y, <i8 2, i8 2>340 %m = and <2 x i8> %r, <i8 13, i8 13>341 %b = or <2 x i8> %m, %x342 %l = shl <2 x i8> %b, <i8 2, i8 2>343 ret <2 x i8> %l344}345 346define i8 @lshr_and_xor(i8 %a, i8 %y) {347; CHECK-LABEL: @lshr_and_xor(348; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42349; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 2350; CHECK-NEXT: [[Y_MASK:%.*]] = and i8 [[Y:%.*]], 52351; CHECK-NEXT: [[L:%.*]] = xor i8 [[Y_MASK]], [[B1]]352; CHECK-NEXT: ret i8 [[L]]353;354 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization355 %r = lshr i8 %y, 2356 %m = and i8 %r, 13357 %b = xor i8 %m, %x358 %l = shl i8 %b, 2359 ret i8 %l360}361 362define <2 x i8> @lshr_and_xor_commute_splat(<2 x i8> %a, <2 x i8> %y) {363; CHECK-LABEL: @lshr_and_xor_commute_splat(364; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)365; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 2)366; CHECK-NEXT: [[Y_MASK:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 52)367; CHECK-NEXT: [[L:%.*]] = xor <2 x i8> [[Y_MASK]], [[B1]]368; CHECK-NEXT: ret <2 x i8> [[L]]369;370 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization371 %r = lshr <2 x i8> %y, <i8 2, i8 2>372 %m = and <2 x i8> %r, <i8 13, i8 13>373 %b = xor <2 x i8> %x, %m374 %l = shl <2 x i8> %b, <i8 2, i8 2>375 ret <2 x i8> %l376}377 378define i8 @lshr_and_add_use1(i8 %x, i8 %y) {379; CHECK-LABEL: @lshr_and_add_use1(380; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 3381; CHECK-NEXT: call void @use(i8 [[R]])382; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 12383; CHECK-NEXT: [[B:%.*]] = add i8 [[X:%.*]], [[M]]384; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 3385; CHECK-NEXT: ret i8 [[L]]386;387 %r = lshr i8 %y, 3388 call void @use(i8 %r)389 %m = and i8 %r, 12390 %b = add i8 %x, %m391 %l = shl i8 %b, 3392 ret i8 %l393}394 395define i8 @lshr_and_add_use2(i8 %x, i8 %y) {396; CHECK-LABEL: @lshr_and_add_use2(397; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 3398; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 12399; CHECK-NEXT: call void @use(i8 [[M]])400; CHECK-NEXT: [[B:%.*]] = add i8 [[X:%.*]], [[M]]401; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 3402; CHECK-NEXT: ret i8 [[L]]403;404 %r = lshr i8 %y, 3405 %m = and i8 %r, 12406 call void @use(i8 %m)407 %b = add i8 %x, %m408 %l = shl i8 %b, 3409 ret i8 %l410}411 412define i8 @lshr_and_add_use3(i8 %x, i8 %y) {413; CHECK-LABEL: @lshr_and_add_use3(414; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 3415; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 12416; CHECK-NEXT: [[B:%.*]] = add i8 [[X:%.*]], [[M]]417; CHECK-NEXT: call void @use(i8 [[B]])418; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 3419; CHECK-NEXT: ret i8 [[L]]420;421 %r = lshr i8 %y, 3422 %m = and i8 %r, 12423 %b = add i8 %x, %m424 call void @use(i8 %b)425 %l = shl i8 %b, 3426 ret i8 %l427}428 429define i8 @lshr_and_add_use4(i8 %x, i8 %y) {430; CHECK-LABEL: @lshr_and_add_use4(431; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 3432; CHECK-NEXT: call void @use(i8 [[R]])433; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 12434; CHECK-NEXT: call void @use(i8 [[M]])435; CHECK-NEXT: [[B:%.*]] = add i8 [[X:%.*]], [[M]]436; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 3437; CHECK-NEXT: ret i8 [[L]]438;439 %r = lshr i8 %y, 3440 call void @use(i8 %r)441 %m = and i8 %r, 12442 call void @use(i8 %m)443 %b = add i8 %x, %m444 %l = shl i8 %b, 3445 ret i8 %l446}447 448define i8 @lshr_and_add_use5(i8 %x, i8 %y) {449; CHECK-LABEL: @lshr_and_add_use5(450; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 3451; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 12452; CHECK-NEXT: call void @use(i8 [[M]])453; CHECK-NEXT: [[B:%.*]] = add i8 [[X:%.*]], [[M]]454; CHECK-NEXT: call void @use(i8 [[B]])455; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 3456; CHECK-NEXT: ret i8 [[L]]457;458 %r = lshr i8 %y, 3459 %m = and i8 %r, 12460 call void @use(i8 %m)461 %b = add i8 %x, %m462 call void @use(i8 %b)463 %l = shl i8 %b, 3464 ret i8 %l465}466 467define i8 @lshr_and_add_use6(i8 %x, i8 %y) {468; CHECK-LABEL: @lshr_and_add_use6(469; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 3470; CHECK-NEXT: call void @use(i8 [[R]])471; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 12472; CHECK-NEXT: call void @use(i8 [[M]])473; CHECK-NEXT: [[B:%.*]] = add i8 [[X:%.*]], [[M]]474; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 3475; CHECK-NEXT: ret i8 [[L]]476;477 %r = lshr i8 %y, 3478 call void @use(i8 %r)479 %m = and i8 %r, 12480 call void @use(i8 %m)481 %b = add i8 %x, %m482 %l = shl i8 %b, 3483 ret i8 %l484}485 486define <2 x i8> @lshr_add_shl_v2i8_undef(<2 x i8> %x, <2 x i8> %y) {487; CHECK-LABEL: @lshr_add_shl_v2i8_undef(488; CHECK-NEXT: [[A:%.*]] = lshr <2 x i8> [[Y:%.*]], <i8 5, i8 undef>489; CHECK-NEXT: [[B:%.*]] = add <2 x i8> [[A]], [[X:%.*]]490; CHECK-NEXT: [[C:%.*]] = shl <2 x i8> [[B]], <i8 undef, i8 5>491; CHECK-NEXT: ret <2 x i8> [[C]]492;493 %a = lshr <2 x i8> %y, <i8 5, i8 undef>494 %b = add <2 x i8> %a, %x495 %c = shl <2 x i8> %b, <i8 undef, i8 5>496 ret <2 x i8> %c497}498 499define <2 x i8> @lshr_add_shl_v2i8_nonuniform(<2 x i8> %x, <2 x i8> %y) {500; CHECK-LABEL: @lshr_add_shl_v2i8_nonuniform(501; CHECK-NEXT: [[A:%.*]] = lshr <2 x i8> [[Y:%.*]], <i8 5, i8 6>502; CHECK-NEXT: [[B:%.*]] = add <2 x i8> [[A]], [[X:%.*]]503; CHECK-NEXT: [[C:%.*]] = shl <2 x i8> [[B]], <i8 5, i8 6>504; CHECK-NEXT: ret <2 x i8> [[C]]505;506 %a = lshr <2 x i8> %y, <i8 5, i8 6>507 %b = add <2 x i8> %a, %x508 %c = shl <2 x i8> %b, <i8 5, i8 6>509 ret <2 x i8> %c510}511 512define i32 @lshr_add_and_shl(i32 %x, i32 %y) {513; CHECK-LABEL: @lshr_add_and_shl(514; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[Y:%.*]], 5515; CHECK-NEXT: [[X_MASK:%.*]] = and i32 [[X:%.*]], 4064516; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[X_MASK]], [[TMP1]]517; CHECK-NEXT: ret i32 [[TMP2]]518;519 %1 = lshr i32 %x, 5520 %2 = and i32 %1, 127521 %3 = add i32 %y, %2522 %4 = shl i32 %3, 5523 ret i32 %4524}525 526define <2 x i32> @lshr_add_and_shl_v2i32(<2 x i32> %x, <2 x i32> %y) {527; CHECK-LABEL: @lshr_add_and_shl_v2i32(528; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i32> [[Y:%.*]], splat (i32 5)529; CHECK-NEXT: [[X_MASK:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 4064)530; CHECK-NEXT: [[TMP2:%.*]] = add <2 x i32> [[X_MASK]], [[TMP1]]531; CHECK-NEXT: ret <2 x i32> [[TMP2]]532;533 %1 = lshr <2 x i32> %x, <i32 5, i32 5>534 %2 = and <2 x i32> %1, <i32 127, i32 127>535 %3 = add <2 x i32> %y, %2536 %4 = shl <2 x i32> %3, <i32 5, i32 5>537 ret <2 x i32> %4538}539 540define <2 x i32> @lshr_add_and_shl_v2i32_undef(<2 x i32> %x, <2 x i32> %y) {541; CHECK-LABEL: @lshr_add_and_shl_v2i32_undef(542; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i32> [[X:%.*]], <i32 undef, i32 5>543; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], splat (i32 127)544; CHECK-NEXT: [[TMP3:%.*]] = add <2 x i32> [[Y:%.*]], [[TMP2]]545; CHECK-NEXT: [[TMP4:%.*]] = shl <2 x i32> [[TMP3]], <i32 5, i32 undef>546; CHECK-NEXT: ret <2 x i32> [[TMP4]]547;548 %1 = lshr <2 x i32> %x, <i32 undef, i32 5>549 %2 = and <2 x i32> %1, <i32 127, i32 127>550 %3 = add <2 x i32> %y, %2551 %4 = shl <2 x i32> %3, <i32 5, i32 undef>552 ret <2 x i32> %4553}554 555define <2 x i32> @lshr_add_and_shl_v2i32_nonuniform(<2 x i32> %x, <2 x i32> %y) {556; CHECK-LABEL: @lshr_add_and_shl_v2i32_nonuniform(557; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i32> [[X:%.*]], <i32 5, i32 6>558; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], <i32 127, i32 255>559; CHECK-NEXT: [[TMP3:%.*]] = add <2 x i32> [[Y:%.*]], [[TMP2]]560; CHECK-NEXT: [[TMP4:%.*]] = shl <2 x i32> [[TMP3]], <i32 5, i32 6>561; CHECK-NEXT: ret <2 x i32> [[TMP4]]562;563 %1 = lshr <2 x i32> %x, <i32 5, i32 6>564 %2 = and <2 x i32> %1, <i32 127, i32 255>565 %3 = add <2 x i32> %y, %2566 %4 = shl <2 x i32> %3, <i32 5, i32 6>567 ret <2 x i32> %4568}569 570define i32 @shl_add_and_lshr(i32 %x, i32 %y) {571; CHECK-LABEL: @shl_add_and_lshr(572; CHECK-NEXT: [[C1:%.*]] = shl i32 [[Y:%.*]], 4573; CHECK-NEXT: [[X_MASK:%.*]] = and i32 [[X:%.*]], 128574; CHECK-NEXT: [[D:%.*]] = add i32 [[X_MASK]], [[C1]]575; CHECK-NEXT: ret i32 [[D]]576;577 %a = lshr i32 %x, 4578 %b = and i32 %a, 8579 %c = add i32 %b, %y580 %d = shl i32 %c, 4581 ret i32 %d582}583 584define <2 x i32> @shl_add_and_lshr_v2i32(<2 x i32> %x, <2 x i32> %y) {585; CHECK-LABEL: @shl_add_and_lshr_v2i32(586; CHECK-NEXT: [[C1:%.*]] = shl <2 x i32> [[Y:%.*]], splat (i32 4)587; CHECK-NEXT: [[X_MASK:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 128)588; CHECK-NEXT: [[D:%.*]] = add <2 x i32> [[X_MASK]], [[C1]]589; CHECK-NEXT: ret <2 x i32> [[D]]590;591 %a = lshr <2 x i32> %x, <i32 4, i32 4>592 %b = and <2 x i32> %a, <i32 8, i32 8>593 %c = add <2 x i32> %b, %y594 %d = shl <2 x i32> %c, <i32 4, i32 4>595 ret <2 x i32> %d596}597 598define <2 x i32> @shl_add_and_lshr_v2i32_undef(<2 x i32> %x, <2 x i32> %y) {599; CHECK-LABEL: @shl_add_and_lshr_v2i32_undef(600; CHECK-NEXT: [[A:%.*]] = lshr <2 x i32> [[X:%.*]], <i32 4, i32 undef>601; CHECK-NEXT: [[B:%.*]] = and <2 x i32> [[A]], <i32 8, i32 undef>602; CHECK-NEXT: [[C:%.*]] = add <2 x i32> [[B]], [[Y:%.*]]603; CHECK-NEXT: [[D:%.*]] = shl <2 x i32> [[C]], <i32 4, i32 undef>604; CHECK-NEXT: ret <2 x i32> [[D]]605;606 %a = lshr <2 x i32> %x, <i32 4, i32 undef>607 %b = and <2 x i32> %a, <i32 8, i32 undef>608 %c = add <2 x i32> %b, %y609 %d = shl <2 x i32> %c, <i32 4, i32 undef>610 ret <2 x i32> %d611}612 613define <2 x i32> @shl_add_and_lshr_v2i32_nonuniform(<2 x i32> %x, <2 x i32> %y) {614; CHECK-LABEL: @shl_add_and_lshr_v2i32_nonuniform(615; CHECK-NEXT: [[A:%.*]] = lshr <2 x i32> [[X:%.*]], <i32 4, i32 5>616; CHECK-NEXT: [[B:%.*]] = and <2 x i32> [[A]], <i32 8, i32 9>617; CHECK-NEXT: [[C:%.*]] = add <2 x i32> [[B]], [[Y:%.*]]618; CHECK-NEXT: [[D:%.*]] = shl <2 x i32> [[C]], <i32 4, i32 5>619; CHECK-NEXT: ret <2 x i32> [[D]]620;621 %a = lshr <2 x i32> %x, <i32 4, i32 5>622 %b = and <2 x i32> %a, <i32 8, i32 9>623 %c = add <2 x i32> %b, %y624 %d = shl <2 x i32> %c, <i32 4, i32 5>625 ret <2 x i32> %d626}627 628define <4 x i32> @test_FoldShiftByConstant_CreateSHL(<4 x i32> %in) {629; CHECK-LABEL: @test_FoldShiftByConstant_CreateSHL(630; CHECK-NEXT: [[VSHL_N:%.*]] = mul <4 x i32> [[IN:%.*]], <i32 0, i32 -32, i32 0, i32 -32>631; CHECK-NEXT: ret <4 x i32> [[VSHL_N]]632;633 %mul.i = mul <4 x i32> %in, <i32 0, i32 -1, i32 0, i32 -1>634 %vshl_n = shl <4 x i32> %mul.i, <i32 5, i32 5, i32 5, i32 5>635 ret <4 x i32> %vshl_n636}637 638define <8 x i16> @test_FoldShiftByConstant_CreateSHL2(<8 x i16> %in) {639; CHECK-LABEL: @test_FoldShiftByConstant_CreateSHL2(640; CHECK-NEXT: [[VSHL_N:%.*]] = mul <8 x i16> [[IN:%.*]], <i16 0, i16 -32, i16 0, i16 -32, i16 0, i16 -32, i16 0, i16 -32>641; CHECK-NEXT: ret <8 x i16> [[VSHL_N]]642;643 %mul.i = mul <8 x i16> %in, <i16 0, i16 -1, i16 0, i16 -1, i16 0, i16 -1, i16 0, i16 -1>644 %vshl_n = shl <8 x i16> %mul.i, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>645 ret <8 x i16> %vshl_n646}647 648define <16 x i8> @test_FoldShiftByConstant_CreateAnd(<16 x i8> %in0) {649; CHECK-LABEL: @test_FoldShiftByConstant_CreateAnd(650; CHECK-NEXT: [[VSRA_N2:%.*]] = mul <16 x i8> [[IN0:%.*]], splat (i8 33)651; CHECK-NEXT: [[VSHL_N:%.*]] = and <16 x i8> [[VSRA_N2]], splat (i8 -32)652; CHECK-NEXT: ret <16 x i8> [[VSHL_N]]653;654 %vsra_n = ashr <16 x i8> %in0, <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>655 %tmp = add <16 x i8> %in0, %vsra_n656 %vshl_n = shl <16 x i8> %tmp, <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>657 ret <16 x i8> %vshl_n658}659 660define <vscale x 1 x i8> @test_FoldShiftByConstant_CreateAnd_scalable(<vscale x 1 x i8> %x) {661; CHECK-LABEL: @test_FoldShiftByConstant_CreateAnd_scalable(662; CHECK-NEXT: [[TMP1:%.*]] = shl <vscale x 1 x i8> [[X:%.*]], splat (i8 2)663; CHECK-NEXT: [[TMP2:%.*]] = and <vscale x 1 x i8> [[TMP1]], splat (i8 8)664; CHECK-NEXT: ret <vscale x 1 x i8> [[TMP2]]665;666 %1 = and <vscale x 1 x i8> %x, splat (i8 2)667 %2 = shl <vscale x 1 x i8> %1, splat (i8 2)668 ret <vscale x 1 x i8> %2669}670