brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.6 KiB · 5ee8716 Raw
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