brintos

brintos / llvm-project-archived public Read only

0
0
Text · 33.1 KiB · 75bdf66 Raw
970 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i8 @shl_and_and(i8 %x, i8 %y) {5; CHECK-LABEL: @shl_and_and(6; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[Y:%.*]], [[X:%.*]]7; CHECK-NEXT:    [[TMP2:%.*]] = shl i8 [[TMP1]], 48; CHECK-NEXT:    [[BW1:%.*]] = and i8 [[TMP2]], 809; CHECK-NEXT:    ret i8 [[BW1]]10;11  %shift1 = shl i8 %x, 412  %shift2 = shl i8 %y, 413  %bw2 = and i8 %shift2, 8814  %bw1 = and i8 %shift1, %bw215  ret i8 %bw116}17 18define i8 @shl_and_and_fail(i8 %x, i8 %y) {19; CHECK-LABEL: @shl_and_and_fail(20; CHECK-NEXT:    [[SHIFT1:%.*]] = shl i8 [[X:%.*]], 421; CHECK-NEXT:    [[SHIFT2:%.*]] = shl i8 [[Y:%.*]], 522; CHECK-NEXT:    [[BW2:%.*]] = and i8 [[SHIFT2]], 6423; CHECK-NEXT:    [[BW1:%.*]] = and i8 [[SHIFT1]], [[BW2]]24; CHECK-NEXT:    ret i8 [[BW1]]25;26  %shift1 = shl i8 %x, 427  %shift2 = shl i8 %y, 528  %bw2 = and i8 %shift2, 8829  %bw1 = and i8 %shift1, %bw230  ret i8 %bw131}32 33define i8 @shl_add_add(i8 %x, i8 %y) {34; CHECK-LABEL: @shl_add_add(35; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[Y:%.*]], [[X:%.*]]36; CHECK-NEXT:    [[TMP2:%.*]] = shl i8 [[TMP1]], 237; CHECK-NEXT:    [[BW1:%.*]] = add i8 [[TMP2]], 4838; CHECK-NEXT:    ret i8 [[BW1]]39;40  %shift1 = shl i8 %x, 241  %shift2 = shl i8 %y, 242  %bw2 = add i8 %shift2, 4843  %bw1 = add i8 %shift1, %bw244  ret i8 %bw145}46 47define i8 @shl_add_add_fail(i8 %x, i8 %y) {48; CHECK-LABEL: @shl_add_add_fail(49; CHECK-NEXT:    [[SHIFT1:%.*]] = lshr i8 [[X:%.*]], 250; CHECK-NEXT:    [[SHIFT2:%.*]] = lshr i8 [[Y:%.*]], 251; CHECK-NEXT:    [[BW2:%.*]] = add nuw nsw i8 [[SHIFT2]], 4852; CHECK-NEXT:    [[BW1:%.*]] = add nuw i8 [[SHIFT1]], [[BW2]]53; CHECK-NEXT:    ret i8 [[BW1]]54;55  %shift1 = lshr i8 %x, 256  %shift2 = lshr i8 %y, 257  %bw2 = add i8 %shift2, 4858  %bw1 = add i8 %shift1, %bw259  ret i8 %bw160}61 62define i8 @shl_and_and_fail2(i8 %x, i8 %y) {63; CHECK-LABEL: @shl_and_and_fail2(64; CHECK-NEXT:    [[SHIFT1:%.*]] = shl i8 4, [[X:%.*]]65; CHECK-NEXT:    [[SHIFT2:%.*]] = shl i8 4, [[Y:%.*]]66; CHECK-NEXT:    [[BW2:%.*]] = and i8 [[SHIFT2]], 8867; CHECK-NEXT:    [[BW1:%.*]] = and i8 [[SHIFT1]], [[BW2]]68; CHECK-NEXT:    ret i8 [[BW1]]69;70  %shift1 = shl i8 4, %x71  %shift2 = shl i8 4, %y72  %bw2 = and i8 %shift2, 8873  %bw1 = and i8 %shift1, %bw274  ret i8 %bw175}76 77define <2 x i8> @lshr_and_or(<2 x i8> %x, <2 x i8> %y) {78; CHECK-LABEL: @lshr_and_or(79; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i8> [[X:%.*]], <i8 -64, i8 96>80; CHECK-NEXT:    [[TMP2:%.*]] = or <2 x i8> [[Y:%.*]], [[TMP1]]81; CHECK-NEXT:    [[BW1:%.*]] = lshr <2 x i8> [[TMP2]], <i8 4, i8 5>82; CHECK-NEXT:    ret <2 x i8> [[BW1]]83;84  %shift1 = lshr <2 x i8> %x, <i8 4, i8 5>85  %shift2 = lshr <2 x i8> %y, <i8 4, i8 5>86  %bw2 = and <2 x i8> %shift1, <i8 44, i8 99>87  %bw1 = or <2 x i8> %shift2, %bw288  ret <2 x i8> %bw189}90 91define <2 x i8> @lshr_and_or_fail(<2 x i8> %x, <2 x i8> %y) {92; CHECK-LABEL: @lshr_and_or_fail(93; CHECK-NEXT:    [[SHIFT1:%.*]] = lshr <2 x i8> [[X:%.*]], <i8 4, i8 5>94; CHECK-NEXT:    [[SHIFT2:%.*]] = lshr <2 x i8> [[Y:%.*]], <i8 5, i8 4>95; CHECK-NEXT:    [[BW2:%.*]] = and <2 x i8> [[SHIFT2]], <i8 44, i8 99>96; CHECK-NEXT:    [[BW1:%.*]] = or <2 x i8> [[SHIFT1]], [[BW2]]97; CHECK-NEXT:    ret <2 x i8> [[BW1]]98;99  %shift1 = lshr <2 x i8> %x, <i8 4, i8 5>100  %shift2 = lshr <2 x i8> %y, <i8 5, i8 4>101  %bw2 = and <2 x i8> %shift2, <i8 44, i8 99>102  %bw1 = or <2 x i8> %shift1, %bw2103  ret <2 x i8> %bw1104}105 106define i8 @shl_and_xor(i8 %x, i8 %y) {107; CHECK-LABEL: @shl_and_xor(108; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[X:%.*]], 10109; CHECK-NEXT:    [[TMP2:%.*]] = xor i8 [[Y:%.*]], [[TMP1]]110; CHECK-NEXT:    [[BW1:%.*]] = shl i8 [[TMP2]], 1111; CHECK-NEXT:    ret i8 [[BW1]]112;113  %shift1 = shl i8 %x, 1114  %shift2 = shl i8 %y, 1115  %bw2 = and i8 %shift1, 20116  %bw1 = xor i8 %shift2, %bw2117  ret i8 %bw1118}119 120define i8 @shl_and_add(i8 %x, i8 %y) {121; CHECK-LABEL: @shl_and_add(122; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[Y:%.*]], 59123; CHECK-NEXT:    [[TMP2:%.*]] = add i8 [[X:%.*]], [[TMP1]]124; CHECK-NEXT:    [[BW1:%.*]] = shl i8 [[TMP2]], 1125; CHECK-NEXT:    ret i8 [[BW1]]126;127  %shift1 = shl i8 %x, 1128  %shift2 = shl i8 %y, 1129  %bw2 = and i8 %shift2, 119130  %bw1 = add i8 %shift1, %bw2131  ret i8 %bw1132}133 134define i8 @shl_xor_add_fail(i8 %x, i8 %y) {135; CHECK-LABEL: @shl_xor_add_fail(136; CHECK-NEXT:    [[SHIFT1:%.*]] = shl i8 [[X:%.*]], 1137; CHECK-NEXT:    [[SHIFT2:%.*]] = shl i8 [[Y:%.*]], 1138; CHECK-NEXT:    [[BW2:%.*]] = xor i8 [[SHIFT2]], 119139; CHECK-NEXT:    [[BW1:%.*]] = add i8 [[SHIFT1]], [[BW2]]140; CHECK-NEXT:    ret i8 [[BW1]]141;142  %shift1 = shl i8 %x, 1143  %shift2 = shl i8 %y, 1144  %bw2 = xor i8 %shift2, 119145  %bw1 = add i8 %shift1, %bw2146  ret i8 %bw1147}148 149define i8 @lshr_or_and(i8 %x, i8 %y) {150; CHECK-LABEL: @lshr_or_and(151; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X:%.*]], -64152; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[Y:%.*]], [[TMP1]]153; CHECK-NEXT:    [[BW1:%.*]] = lshr i8 [[TMP2]], 5154; CHECK-NEXT:    ret i8 [[BW1]]155;156  %shift1 = lshr i8 %x, 5157  %shift2 = lshr i8 %y, 5158  %bw2 = or i8 %shift1, 198159  %bw1 = and i8 %bw2, %shift2160  ret i8 %bw1161}162 163define i8 @lshr_or_or_fail(i8 %x, i8 %y) {164; CHECK-LABEL: @lshr_or_or_fail(165; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Y:%.*]], [[X:%.*]]166; CHECK-NEXT:    [[TMP2:%.*]] = lshr i8 [[TMP1]], 5167; CHECK-NEXT:    [[BW1:%.*]] = or i8 [[TMP2]], -58168; CHECK-NEXT:    ret i8 [[BW1]]169;170  %shift1 = lshr i8 %x, 5171  %shift2 = lshr i8 %y, 5172  %bw2 = or i8 %shift2, 198173  %bw1 = or i8 %shift1, %bw2174  ret i8 %bw1175}176 177define <2 x i8> @shl_xor_and(<2 x i8> %x, <2 x i8> %y) {178; CHECK-LABEL: @shl_xor_and(179; CHECK-NEXT:    [[TMP1:%.*]] = xor <2 x i8> [[Y:%.*]], <i8 11, i8 poison>180; CHECK-NEXT:    [[TMP2:%.*]] = and <2 x i8> [[X:%.*]], [[TMP1]]181; CHECK-NEXT:    [[BW1:%.*]] = shl <2 x i8> [[TMP2]], <i8 2, i8 poison>182; CHECK-NEXT:    ret <2 x i8> [[BW1]]183;184  %shift1 = shl <2 x i8> %x, <i8 2, i8 poison>185  %shift2 = shl <2 x i8> %y, <i8 2, i8 poison>186  %bw2 = xor <2 x i8> %shift2, <i8 44, i8 poison>187  %bw1 = and <2 x i8> %bw2, %shift1188  ret <2 x i8> %bw1189}190 191define <2 x i8> @shl_xor_and_fail(<2 x i8> %x, <2 x i8> %y) {192; CHECK-LABEL: @shl_xor_and_fail(193; CHECK-NEXT:    [[SHIFT1:%.*]] = shl <2 x i8> [[X:%.*]], <i8 2, i8 poison>194; CHECK-NEXT:    [[SHIFT2:%.*]] = shl <2 x i8> [[Y:%.*]], <i8 poison, i8 2>195; CHECK-NEXT:    [[BW2:%.*]] = xor <2 x i8> [[SHIFT2]], <i8 44, i8 poison>196; CHECK-NEXT:    [[BW1:%.*]] = and <2 x i8> [[SHIFT1]], [[BW2]]197; CHECK-NEXT:    ret <2 x i8> [[BW1]]198;199  %shift1 = shl <2 x i8> %x, <i8 2, i8 poison>200  %shift2 = shl <2 x i8> %y, <i8 poison, i8 2>201  %bw2 = xor <2 x i8> %shift2, <i8 44, i8 poison>202  %bw1 = and <2 x i8> %shift1, %bw2203  ret <2 x i8> %bw1204}205 206define i8 @lshr_or_or_no_const(i8 %x, i8 %y, i8 %sh, i8 %mask) {207; CHECK-LABEL: @lshr_or_or_no_const(208; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Y:%.*]], [[X:%.*]]209; CHECK-NEXT:    [[TMP2:%.*]] = lshr i8 [[TMP1]], [[SH:%.*]]210; CHECK-NEXT:    [[BW1:%.*]] = or i8 [[TMP2]], [[MASK:%.*]]211; CHECK-NEXT:    ret i8 [[BW1]]212;213  %shift1 = lshr i8 %x, %sh214  %shift2 = lshr i8 %y, %sh215  %bw2 = or i8 %shift2, %mask216  %bw1 = or i8 %shift1, %bw2217  ret i8 %bw1218}219 220define i8 @lshr_or_or_no_const_fail(i8 %x, i8 %y, i8 %sh, i8 %mask) {221; CHECK-LABEL: @lshr_or_or_no_const_fail(222; CHECK-NEXT:    [[SHIFT1:%.*]] = shl i8 [[X:%.*]], [[SH:%.*]]223; CHECK-NEXT:    [[SHIFT2:%.*]] = lshr i8 [[Y:%.*]], [[SH]]224; CHECK-NEXT:    [[BW2:%.*]] = or i8 [[SHIFT2]], [[MASK:%.*]]225; CHECK-NEXT:    [[BW1:%.*]] = or i8 [[SHIFT1]], [[BW2]]226; CHECK-NEXT:    ret i8 [[BW1]]227;228  %shift1 = shl i8 %x, %sh229  %shift2 = lshr i8 %y, %sh230  %bw2 = or i8 %shift2, %mask231  %bw1 = or i8 %shift1, %bw2232  ret i8 %bw1233}234 235define i8 @shl_xor_xor_no_const(i8 %x, i8 %y, i8 %sh, i8 %mask) {236; CHECK-LABEL: @shl_xor_xor_no_const(237; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], [[X:%.*]]238; CHECK-NEXT:    [[TMP2:%.*]] = shl i8 [[TMP1]], [[SH:%.*]]239; CHECK-NEXT:    [[BW1:%.*]] = xor i8 [[TMP2]], [[MASK:%.*]]240; CHECK-NEXT:    ret i8 [[BW1]]241;242  %shift1 = shl i8 %x, %sh243  %shift2 = shl i8 %y, %sh244  %bw2 = xor i8 %shift2, %mask245  %bw1 = xor i8 %shift1, %bw2246  ret i8 %bw1247}248 249define i8 @shl_xor_and_no_const_fail(i8 %x, i8 %y, i8 %sh, i8 %mask) {250; CHECK-LABEL: @shl_xor_and_no_const_fail(251; CHECK-NEXT:    [[SHIFT1:%.*]] = shl i8 [[X:%.*]], [[SH:%.*]]252; CHECK-NEXT:    [[SHIFT2:%.*]] = shl i8 [[Y:%.*]], [[SH]]253; CHECK-NEXT:    [[BW2:%.*]] = xor i8 [[SHIFT2]], [[MASK:%.*]]254; CHECK-NEXT:    [[BW1:%.*]] = and i8 [[SHIFT1]], [[BW2]]255; CHECK-NEXT:    ret i8 [[BW1]]256;257  %shift1 = shl i8 %x, %sh258  %shift2 = shl i8 %y, %sh259  %bw2 = xor i8 %shift2, %mask260  %bw1 = and i8 %shift1, %bw2261  ret i8 %bw1262}263 264define <2 x i8> @shl_and_and_no_const(<2 x i8> %x, <2 x i8> %y, <2 x i8> %sh, <2 x i8> %mask) {265; CHECK-LABEL: @shl_and_and_no_const(266; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i8> [[Y:%.*]], [[X:%.*]]267; CHECK-NEXT:    [[TMP2:%.*]] = shl <2 x i8> [[TMP1]], [[SH:%.*]]268; CHECK-NEXT:    [[BW1:%.*]] = and <2 x i8> [[TMP2]], [[MASK:%.*]]269; CHECK-NEXT:    ret <2 x i8> [[BW1]]270;271  %shift1 = shl <2 x i8> %x, %sh272  %shift2 = shl <2 x i8> %y, %sh273  %bw2 = and <2 x i8> %shift2, %mask274  %bw1 = and <2 x i8> %shift1, %bw2275  ret <2 x i8> %bw1276}277 278define i8 @shl_add_add_no_const(i8 %x, i8 %y, i8 %sh, i8 %mask) {279; CHECK-LABEL: @shl_add_add_no_const(280; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[Y:%.*]], [[X:%.*]]281; CHECK-NEXT:    [[TMP2:%.*]] = shl i8 [[TMP1]], [[SH:%.*]]282; CHECK-NEXT:    [[BW1:%.*]] = add i8 [[TMP2]], [[MASK:%.*]]283; CHECK-NEXT:    ret i8 [[BW1]]284;285  %shift1 = shl i8 %x, %sh286  %shift2 = shl i8 %y, %sh287  %bw2 = add i8 %shift2, %mask288  %bw1 = add i8 %shift1, %bw2289  ret i8 %bw1290}291 292define i8 @lshr_add_add_no_const_fail(i8 %x, i8 %y, i8 %sh, i8 %mask) {293; CHECK-LABEL: @lshr_add_add_no_const_fail(294; CHECK-NEXT:    [[SHIFT1:%.*]] = lshr i8 [[X:%.*]], [[SH:%.*]]295; CHECK-NEXT:    [[SHIFT2:%.*]] = lshr i8 [[Y:%.*]], [[SH]]296; CHECK-NEXT:    [[BW2:%.*]] = add i8 [[SHIFT2]], [[MASK:%.*]]297; CHECK-NEXT:    [[BW1:%.*]] = add i8 [[SHIFT1]], [[BW2]]298; CHECK-NEXT:    ret i8 [[BW1]]299;300  %shift1 = lshr i8 %x, %sh301  %shift2 = lshr i8 %y, %sh302  %bw2 = add i8 %shift2, %mask303  %bw1 = add i8 %shift1, %bw2304  ret i8 %bw1305}306 307define <2 x i8> @lshr_add_and(<2 x i8> %x, <2 x i8> %y) {308; CHECK-LABEL: @lshr_add_and(309; CHECK-NEXT:    [[TMP1:%.*]] = add <2 x i8> [[Y:%.*]], <i8 -8, i8 16>310; CHECK-NEXT:    [[TMP2:%.*]] = and <2 x i8> [[X:%.*]], [[TMP1]]311; CHECK-NEXT:    [[BW1:%.*]] = lshr <2 x i8> [[TMP2]], <i8 3, i8 4>312; CHECK-NEXT:    ret <2 x i8> [[BW1]]313;314  %shift1 = lshr <2 x i8> %x, <i8 3, i8 4>315  %shift2 = lshr <2 x i8> %y, <i8 3, i8 4>316  %bw2 = add <2 x i8> %shift2, <i8 255, i8 1>317  %bw1 = and <2 x i8> %shift1, %bw2318  ret <2 x i8> %bw1319}320 321define <2 x i8> @lshr_add_or_fail_dif_masks(<2 x i8> %x, <2 x i8> %y) {322; CHECK-LABEL: @lshr_add_or_fail_dif_masks(323; CHECK-NEXT:    [[SHIFT1:%.*]] = lshr <2 x i8> [[X:%.*]], <i8 3, i8 4>324; CHECK-NEXT:    [[SHIFT2:%.*]] = lshr <2 x i8> [[Y:%.*]], <i8 poison, i8 3>325; CHECK-NEXT:    [[BW2:%.*]] = add nsw <2 x i8> [[SHIFT2]], <i8 -1, i8 1>326; CHECK-NEXT:    [[BW1:%.*]] = and <2 x i8> [[SHIFT1]], [[BW2]]327; CHECK-NEXT:    ret <2 x i8> [[BW1]]328;329  %shift1 = lshr <2 x i8> %x, <i8 3, i8 4>330  %shift2 = lshr <2 x i8> %y, <i8 poison, i8 3>331  %bw2 = add <2 x i8> %shift2, <i8 255, i8 1>332  %bw1 = and <2 x i8> %shift1, %bw2333  ret <2 x i8> %bw1334}335 336define <2 x i8> @shl_or_or_good_mask(<2 x i8> %x, <2 x i8> %y) {337; CHECK-LABEL: @shl_or_or_good_mask(338; CHECK-NEXT:    [[TMP1:%.*]] = or <2 x i8> [[Y:%.*]], [[X:%.*]]339; CHECK-NEXT:    [[TMP2:%.*]] = shl <2 x i8> [[TMP1]], splat (i8 1)340; CHECK-NEXT:    [[BW1:%.*]] = or <2 x i8> [[TMP2]], <i8 18, i8 24>341; CHECK-NEXT:    ret <2 x i8> [[BW1]]342;343  %shift1 = shl <2 x i8> %x, <i8 1, i8 1>344  %shift2 = shl <2 x i8> %y, <i8 1, i8 1>345  %bw2 = or <2 x i8> %shift2, <i8 18, i8 24>346  %bw1 = or <2 x i8> %shift1, %bw2347  ret <2 x i8> %bw1348}349 350define <2 x i8> @shl_or_or_fail_bad_mask(<2 x i8> %x, <2 x i8> %y) {351; CHECK-LABEL: @shl_or_or_fail_bad_mask(352; CHECK-NEXT:    [[TMP1:%.*]] = or <2 x i8> [[Y:%.*]], [[X:%.*]]353; CHECK-NEXT:    [[TMP2:%.*]] = shl <2 x i8> [[TMP1]], splat (i8 1)354; CHECK-NEXT:    [[BW1:%.*]] = or <2 x i8> [[TMP2]], <i8 19, i8 24>355; CHECK-NEXT:    ret <2 x i8> [[BW1]]356;357  %shift1 = shl <2 x i8> %x, <i8 1, i8 1>358  %shift2 = shl <2 x i8> %y, <i8 1, i8 1>359  %bw2 = or <2 x i8> %shift2, <i8 19, i8 24>360  %bw1 = or <2 x i8> %shift1, %bw2361  ret <2 x i8> %bw1362}363 364define i8 @lshr_xor_or_good_mask(i8 %x, i8 %y) {365; CHECK-LABEL: @lshr_xor_or_good_mask(366; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Y:%.*]], [[X:%.*]]367; CHECK-NEXT:    [[TMP2:%.*]] = lshr i8 [[TMP1]], 4368; CHECK-NEXT:    [[BW1:%.*]] = or disjoint i8 [[TMP2]], 48369; CHECK-NEXT:    ret i8 [[BW1]]370;371  %shift1 = lshr i8 %x, 4372  %shift2 = lshr i8 %y, 4373  %bw2 = xor i8 %shift2, 48374  %bw1 = or i8 %shift1, %bw2375  ret i8 %bw1376}377 378define i8 @lshr_xor_or_fail_bad_mask(i8 %x, i8 %y) {379; CHECK-LABEL: @lshr_xor_or_fail_bad_mask(380; CHECK-NEXT:    [[SHIFT1:%.*]] = lshr i8 [[X:%.*]], 6381; CHECK-NEXT:    [[SHIFT2:%.*]] = lshr i8 [[Y:%.*]], 6382; CHECK-NEXT:    [[BW2:%.*]] = xor i8 [[SHIFT2]], -127383; CHECK-NEXT:    [[BW1:%.*]] = or i8 [[SHIFT1]], [[BW2]]384; CHECK-NEXT:    ret i8 [[BW1]]385;386  %shift1 = lshr i8 %x, 6387  %shift2 = lshr i8 %y, 6388  %bw2 = xor i8 %shift2, 129389  %bw1 = or i8 %shift1, %bw2390  ret i8 %bw1391}392 393define <2 x i8> @lshr_or_xor_good_mask(<2 x i8> %x, <2 x i8> %y) {394; CHECK-LABEL: @lshr_or_xor_good_mask(395; CHECK-NEXT:    [[TMP1:%.*]] = or <2 x i8> [[Y:%.*]], <i8 -64, i8 64>396; CHECK-NEXT:    [[TMP2:%.*]] = xor <2 x i8> [[X:%.*]], [[TMP1]]397; CHECK-NEXT:    [[BW1:%.*]] = lshr <2 x i8> [[TMP2]], splat (i8 6)398; CHECK-NEXT:    ret <2 x i8> [[BW1]]399;400  %shift1 = lshr <2 x i8> %x, <i8 6, i8 6>401  %shift2 = lshr <2 x i8> %y, <i8 6, i8 6>402  %bw2 = or <2 x i8> %shift2, <i8 3, i8 1>403  %bw1 = xor <2 x i8> %shift1, %bw2404  ret <2 x i8> %bw1405}406 407define <2 x i8> @lshr_or_xor_fail_bad_mask(<2 x i8> %x, <2 x i8> %y) {408; CHECK-LABEL: @lshr_or_xor_fail_bad_mask(409; CHECK-NEXT:    [[SHIFT1:%.*]] = lshr <2 x i8> [[X:%.*]], splat (i8 6)410; CHECK-NEXT:    [[SHIFT2:%.*]] = lshr <2 x i8> [[Y:%.*]], splat (i8 6)411; CHECK-NEXT:    [[BW2:%.*]] = or <2 x i8> [[SHIFT2]], <i8 7, i8 1>412; CHECK-NEXT:    [[BW1:%.*]] = xor <2 x i8> [[SHIFT1]], [[BW2]]413; CHECK-NEXT:    ret <2 x i8> [[BW1]]414;415  %shift1 = lshr <2 x i8> %x, <i8 6, i8 6>416  %shift2 = lshr <2 x i8> %y, <i8 6, i8 6>417  %bw2 = or <2 x i8> %shift2, <i8 7, i8 1>418  %bw1 = xor <2 x i8> %shift1, %bw2419  ret <2 x i8> %bw1420}421 422define i8 @shl_xor_xor_good_mask(i8 %x, i8 %y) {423; CHECK-LABEL: @shl_xor_xor_good_mask(424; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], [[X:%.*]]425; CHECK-NEXT:    [[TMP2:%.*]] = shl i8 [[TMP1]], 1426; CHECK-NEXT:    [[BW1:%.*]] = xor i8 [[TMP2]], 88427; CHECK-NEXT:    ret i8 [[BW1]]428;429  %shift1 = shl i8 %x, 1430  %shift2 = shl i8 %y, 1431  %bw2 = xor i8 %shift2, 88432  %bw1 = xor i8 %shift1, %bw2433  ret i8 %bw1434}435 436define i8 @shl_xor_xor_bad_mask_distribute(i8 %x, i8 %y) {437; CHECK-LABEL: @shl_xor_xor_bad_mask_distribute(438; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], [[X:%.*]]439; CHECK-NEXT:    [[TMP2:%.*]] = shl i8 [[TMP1]], 1440; CHECK-NEXT:    [[BW1:%.*]] = xor i8 [[TMP2]], -68441; CHECK-NEXT:    ret i8 [[BW1]]442;443  %shift1 = shl i8 %x, 1444  %shift2 = shl i8 %y, 1445  %bw2 = xor i8 %shift2, 188446  %bw1 = xor i8 %shift1, %bw2447  ret i8 %bw1448}449 450define i8 @shl_add_and(i8 %x, i8 %y) {451; CHECK-LABEL: @shl_add_and(452; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[Y:%.*]], 61453; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[X:%.*]], [[TMP1]]454; CHECK-NEXT:    [[BW1:%.*]] = shl i8 [[TMP2]], 1455; CHECK-NEXT:    ret i8 [[BW1]]456;457  %shift1 = shl i8 %x, 1458  %shift2 = shl i8 %y, 1459  %bw2 = add i8 %shift2, 123460  %bw1 = and i8 %shift1, %bw2461  ret i8 %bw1462}463 464define i8 @lshr_and_add_fail(i8 %x, i8 %y) {465; CHECK-LABEL: @lshr_and_add_fail(466; CHECK-NEXT:    [[SHIFT1:%.*]] = lshr i8 [[X:%.*]], 1467; CHECK-NEXT:    [[SHIFT2:%.*]] = lshr i8 [[Y:%.*]], 1468; CHECK-NEXT:    [[BW2:%.*]] = and i8 [[SHIFT2]], 123469; CHECK-NEXT:    [[BW1:%.*]] = add nuw i8 [[SHIFT1]], [[BW2]]470; CHECK-NEXT:    ret i8 [[BW1]]471;472  %shift1 = lshr i8 %x, 1473  %shift2 = lshr i8 %y, 1474  %bw2 = and i8 %shift2, 123475  %bw1 = add i8 %shift1, %bw2476  ret i8 %bw1477}478 479define i8 @lshr_add_or_fail(i8 %x, i8 %y) {480; CHECK-LABEL: @lshr_add_or_fail(481; CHECK-NEXT:    [[SHIFT1:%.*]] = lshr i8 [[X:%.*]], 1482; CHECK-NEXT:    [[SHIFT2:%.*]] = lshr i8 [[Y:%.*]], 1483; CHECK-NEXT:    [[BW2:%.*]] = add nuw i8 [[SHIFT2]], 123484; CHECK-NEXT:    [[BW1:%.*]] = or i8 [[SHIFT1]], [[BW2]]485; CHECK-NEXT:    ret i8 [[BW1]]486;487  %shift1 = lshr i8 %x, 1488  %shift2 = lshr i8 %y, 1489  %bw2 = add i8 %shift2, 123490  %bw1 = or i8 %shift1, %bw2491  ret i8 %bw1492}493 494define i8 @lshr_add_xor_fail(i8 %x, i8 %y) {495; CHECK-LABEL: @lshr_add_xor_fail(496; CHECK-NEXT:    [[SHIFT1:%.*]] = lshr i8 [[X:%.*]], 1497; CHECK-NEXT:    [[SHIFT2:%.*]] = lshr i8 [[Y:%.*]], 1498; CHECK-NEXT:    [[BW2:%.*]] = add nuw i8 [[SHIFT2]], 123499; CHECK-NEXT:    [[BW1:%.*]] = xor i8 [[SHIFT1]], [[BW2]]500; CHECK-NEXT:    ret i8 [[BW1]]501;502  %shift1 = lshr i8 %x, 1503  %shift2 = lshr i8 %y, 1504  %bw2 = add i8 %shift2, 123505  %bw1 = xor i8 %shift1, %bw2506  ret i8 %bw1507}508 509define <2 x i8> @lshr_and_add(<2 x i8> %x, <2 x i8> %y) {510; CHECK-LABEL: @lshr_and_add(511; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i8> [[X:%.*]], <i8 11, i8 3>512; CHECK-NEXT:    [[TMP2:%.*]] = add <2 x i8> [[Y:%.*]], [[TMP1]]513; CHECK-NEXT:    [[BW1:%.*]] = shl <2 x i8> [[TMP2]], <i8 4, i8 5>514; CHECK-NEXT:    ret <2 x i8> [[BW1]]515;516  %shift1 = shl <2 x i8> %x, <i8 4, i8 5>517  %shift2 = shl <2 x i8> %y, <i8 4, i8 5>518  %bw2 = and <2 x i8> %shift1, <i8 189, i8 123>519  %bw1 = add <2 x i8> %shift2, %bw2520  ret <2 x i8> %bw1521}522 523define <2 x i8> @lshr_or_add_fail(<2 x i8> %x, <2 x i8> %y) {524; CHECK-LABEL: @lshr_or_add_fail(525; CHECK-NEXT:    [[SHIFT1:%.*]] = shl <2 x i8> [[X:%.*]], <i8 4, i8 5>526; CHECK-NEXT:    [[SHIFT2:%.*]] = shl <2 x i8> [[Y:%.*]], <i8 4, i8 5>527; CHECK-NEXT:    [[BW2:%.*]] = or <2 x i8> [[SHIFT1]], <i8 -67, i8 123>528; CHECK-NEXT:    [[BW1:%.*]] = add <2 x i8> [[SHIFT2]], [[BW2]]529; CHECK-NEXT:    ret <2 x i8> [[BW1]]530;531  %shift1 = shl <2 x i8> %x, <i8 4, i8 5>532  %shift2 = shl <2 x i8> %y, <i8 4, i8 5>533  %bw2 = or <2 x i8> %shift1, <i8 189, i8 123>534  %bw1 = add <2 x i8> %shift2, %bw2535  ret <2 x i8> %bw1536}537 538define i8 @shl_add_and_fail_mismatch_shift(i8 %x, i8 %y) {539; CHECK-LABEL: @shl_add_and_fail_mismatch_shift(540; CHECK-NEXT:    [[SHIFT1:%.*]] = shl i8 [[X:%.*]], 1541; CHECK-NEXT:    [[SHIFT2:%.*]] = lshr i8 [[Y:%.*]], 1542; CHECK-NEXT:    [[BW2:%.*]] = add nuw i8 [[SHIFT2]], 123543; CHECK-NEXT:    [[BW1:%.*]] = and i8 [[SHIFT1]], [[BW2]]544; CHECK-NEXT:    ret i8 [[BW1]]545;546  %shift1 = shl i8 %x, 1547  %shift2 = lshr i8 %y, 1548  %bw2 = add i8 %shift2, 123549  %bw1 = and i8 %shift1, %bw2550  ret i8 %bw1551}552 553; Fold (-x >> y) & ((x >> y) ^ -1) -> (-x & ~x) >> y554 555define i8 @and_ashr_not(i8 %x, i8 %y, i8 %shamt) {556; CHECK-LABEL: @and_ashr_not(557; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -1558; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[X:%.*]], [[TMP1]]559; CHECK-NEXT:    [[AND:%.*]] = ashr i8 [[TMP2]], [[SHAMT:%.*]]560; CHECK-NEXT:    ret i8 [[AND]]561;562  %x.shift = ashr i8 %x, %shamt563  %y.shift = ashr i8 %y, %shamt564  %y.shift.not = xor i8 %y.shift, -1565  %and = and i8 %x.shift, %y.shift.not566  ret i8 %and567}568 569define i8 @and_ashr_not_commuted(i8 %x, i8 %y, i8 %shamt) {570; CHECK-LABEL: @and_ashr_not_commuted(571; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -1572; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[X:%.*]], [[TMP1]]573; CHECK-NEXT:    [[AND:%.*]] = ashr i8 [[TMP2]], [[SHAMT:%.*]]574; CHECK-NEXT:    ret i8 [[AND]]575;576  %x.shift = ashr i8 %x, %shamt577  %y.shift = ashr i8 %y, %shamt578  %y.shift.not = xor i8 %y.shift, -1579  %and = and i8 %y.shift.not, %x.shift580  ret i8 %and581}582 583; Negative test: lshr instead of ashr584 585define i8 @and_ashr_not_fail_lshr_ashr(i8 %x, i8 %y, i8 %shamt) {586; CHECK-LABEL: @and_ashr_not_fail_lshr_ashr(587; CHECK-NEXT:    [[X_SHIFT:%.*]] = lshr i8 [[X:%.*]], [[SHAMT:%.*]]588; CHECK-NEXT:    [[Y_SHIFT:%.*]] = ashr i8 [[Y:%.*]], [[SHAMT]]589; CHECK-NEXT:    [[Y_SHIFT_NOT:%.*]] = xor i8 [[Y_SHIFT]], -1590; CHECK-NEXT:    [[AND:%.*]] = and i8 [[X_SHIFT]], [[Y_SHIFT_NOT]]591; CHECK-NEXT:    ret i8 [[AND]]592;593  %x.shift = lshr i8 %x, %shamt594  %y.shift = ashr i8 %y, %shamt595  %y.shift.not = xor i8 %y.shift, -1596  %and = and i8 %x.shift, %y.shift.not597  ret i8 %and598}599 600; Negative test: lshr instead of ashr601 602define i8 @and_ashr_not_fail_ashr_lshr(i8 %x, i8 %y, i8 %shamt) {603; CHECK-LABEL: @and_ashr_not_fail_ashr_lshr(604; CHECK-NEXT:    [[X_SHIFT:%.*]] = ashr i8 [[X:%.*]], [[SHAMT:%.*]]605; CHECK-NEXT:    [[Y_SHIFT:%.*]] = lshr i8 [[Y:%.*]], [[SHAMT]]606; CHECK-NEXT:    [[Y_SHIFT_NOT:%.*]] = xor i8 [[Y_SHIFT]], -1607; CHECK-NEXT:    [[AND:%.*]] = and i8 [[X_SHIFT]], [[Y_SHIFT_NOT]]608; CHECK-NEXT:    ret i8 [[AND]]609;610  %x.shift = ashr i8 %x, %shamt611  %y.shift = lshr i8 %y, %shamt612  %y.shift.not = xor i8 %y.shift, -1613  %and = and i8 %x.shift, %y.shift.not614  ret i8 %and615}616 617; Negative test: invalid xor constant618 619define i8 @and_ashr_not_fail_invalid_xor_constant(i8 %x, i8 %y, i8 %shamt) {620; CHECK-LABEL: @and_ashr_not_fail_invalid_xor_constant(621; CHECK-NEXT:    [[X_SHIFT:%.*]] = ashr i8 [[X:%.*]], [[SHAMT:%.*]]622; CHECK-NEXT:    [[Y_SHIFT:%.*]] = ashr i8 [[Y:%.*]], [[SHAMT]]623; CHECK-NEXT:    [[Y_SHIFT_NOT:%.*]] = xor i8 [[Y_SHIFT]], -2624; CHECK-NEXT:    [[AND:%.*]] = and i8 [[X_SHIFT]], [[Y_SHIFT_NOT]]625; CHECK-NEXT:    ret i8 [[AND]]626;627  %x.shift = ashr i8 %x, %shamt628  %y.shift = ashr i8 %y, %shamt629  %y.shift.not = xor i8 %y.shift, -2630  %and = and i8 %x.shift, %y.shift.not631  ret i8 %and632}633 634define <4 x i8> @and_ashr_not_vec(<4 x i8> %x, <4 x i8> %y, <4 x i8> %shamt) {635; CHECK-LABEL: @and_ashr_not_vec(636; CHECK-NEXT:    [[TMP1:%.*]] = xor <4 x i8> [[Y:%.*]], splat (i8 -1)637; CHECK-NEXT:    [[TMP2:%.*]] = and <4 x i8> [[X:%.*]], [[TMP1]]638; CHECK-NEXT:    [[AND:%.*]] = ashr <4 x i8> [[TMP2]], [[SHAMT:%.*]]639; CHECK-NEXT:    ret <4 x i8> [[AND]]640;641  %x.shift = ashr <4 x i8> %x, %shamt642  %y.shift = ashr <4 x i8> %y, %shamt643  %y.shift.not = xor <4 x i8> %y.shift, <i8 -1, i8 -1, i8 -1, i8 -1>644  %and = and <4 x i8> %x.shift, %y.shift.not645  ret <4 x i8> %and646}647 648define <4 x i8> @and_ashr_not_vec_commuted(<4 x i8> %x, <4 x i8> %y, <4 x i8> %shamt) {649; CHECK-LABEL: @and_ashr_not_vec_commuted(650; CHECK-NEXT:    [[TMP1:%.*]] = xor <4 x i8> [[Y:%.*]], splat (i8 -1)651; CHECK-NEXT:    [[TMP2:%.*]] = and <4 x i8> [[X:%.*]], [[TMP1]]652; CHECK-NEXT:    [[AND:%.*]] = ashr <4 x i8> [[TMP2]], [[SHAMT:%.*]]653; CHECK-NEXT:    ret <4 x i8> [[AND]]654;655  %x.shift = ashr <4 x i8> %x, %shamt656  %y.shift = ashr <4 x i8> %y, %shamt657  %y.shift.not = xor <4 x i8> %y.shift, <i8 -1, i8 -1, i8 -1, i8 -1>658  %and = and <4 x i8> %y.shift.not, %x.shift659  ret <4 x i8> %and660}661 662define <4 x i8> @and_ashr_not_vec_poison_1(<4 x i8> %x, <4 x i8> %y, <4 x i8> %shamt) {663; CHECK-LABEL: @and_ashr_not_vec_poison_1(664; CHECK-NEXT:    [[TMP1:%.*]] = xor <4 x i8> [[Y:%.*]], splat (i8 -1)665; CHECK-NEXT:    [[TMP2:%.*]] = and <4 x i8> [[X:%.*]], [[TMP1]]666; CHECK-NEXT:    [[AND:%.*]] = ashr <4 x i8> [[TMP2]], [[SHAMT:%.*]]667; CHECK-NEXT:    ret <4 x i8> [[AND]]668;669  %x.shift = ashr <4 x i8> %x, %shamt670  %y.shift = ashr <4 x i8> %y, %shamt671  %y.shift.not = xor <4 x i8> %y.shift, <i8 -1, i8 poison, i8 poison, i8 poison>672  %and = and <4 x i8> %x.shift, %y.shift.not673  ret <4 x i8> %and674}675 676define <4 x i8> @and_ashr_not_vec_poison_2(<4 x i8> %x, <4 x i8> %y, <4 x i8> %shamt) {677; CHECK-LABEL: @and_ashr_not_vec_poison_2(678; CHECK-NEXT:    ret <4 x i8> poison679;680  %x.shift = ashr <4 x i8> %x, %shamt681  %y.shift = ashr <4 x i8> %y, %shamt682  %y.shift.not = xor <4 x i8> %y.shift, <i8 poison, i8 poison, i8 poison, i8 poison>683  %and = and <4 x i8> %x.shift, %y.shift.not684  ret <4 x i8> %and685}686 687; Fold (-x >> y) | ((x >> y) ^ -1) -> (-x | ~x) >> y688 689define i8 @or_ashr_not(i8 %x, i8 %y, i8 %shamt) {690; CHECK-LABEL: @or_ashr_not(691; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -1692; CHECK-NEXT:    [[TMP2:%.*]] = or i8 [[X:%.*]], [[TMP1]]693; CHECK-NEXT:    [[OR:%.*]] = ashr i8 [[TMP2]], [[SHAMT:%.*]]694; CHECK-NEXT:    ret i8 [[OR]]695;696  %x.shift = ashr i8 %x, %shamt697  %y.shift = ashr i8 %y, %shamt698  %y.shift.not = xor i8 %y.shift, -1699  %or = or i8 %x.shift, %y.shift.not700  ret i8 %or701}702 703define i8 @or_ashr_not_commuted(i8 %x, i8 %y, i8 %shamt) {704; CHECK-LABEL: @or_ashr_not_commuted(705; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -1706; CHECK-NEXT:    [[TMP2:%.*]] = or i8 [[X:%.*]], [[TMP1]]707; CHECK-NEXT:    [[OR:%.*]] = ashr i8 [[TMP2]], [[SHAMT:%.*]]708; CHECK-NEXT:    ret i8 [[OR]]709;710  %x.shift = ashr i8 %x, %shamt711  %y.shift = ashr i8 %y, %shamt712  %y.shift.not = xor i8 %y.shift, -1713  %or = or i8 %y.shift.not, %x.shift714  ret i8 %or715}716 717; Negative test: lshr instead of ashr718 719define i8 @or_ashr_not_fail_lshr_ashr(i8 %x, i8 %y, i8 %shamt) {720; CHECK-LABEL: @or_ashr_not_fail_lshr_ashr(721; CHECK-NEXT:    [[X_SHIFT:%.*]] = lshr i8 [[X:%.*]], [[SHAMT:%.*]]722; CHECK-NEXT:    [[Y_SHIFT:%.*]] = ashr i8 [[Y:%.*]], [[SHAMT]]723; CHECK-NEXT:    [[Y_SHIFT_NOT:%.*]] = xor i8 [[Y_SHIFT]], -1724; CHECK-NEXT:    [[OR:%.*]] = or i8 [[X_SHIFT]], [[Y_SHIFT_NOT]]725; CHECK-NEXT:    ret i8 [[OR]]726;727  %x.shift = lshr i8 %x, %shamt728  %y.shift = ashr i8 %y, %shamt729  %y.shift.not = xor i8 %y.shift, -1730  %or = or i8 %x.shift, %y.shift.not731  ret i8 %or732}733 734; Negative test: lshr instead of ashr735 736define i8 @or_ashr_not_fail_ashr_lshr(i8 %x, i8 %y, i8 %shamt) {737; CHECK-LABEL: @or_ashr_not_fail_ashr_lshr(738; CHECK-NEXT:    [[X_SHIFT:%.*]] = ashr i8 [[X:%.*]], [[SHAMT:%.*]]739; CHECK-NEXT:    [[Y_SHIFT:%.*]] = lshr i8 [[Y:%.*]], [[SHAMT]]740; CHECK-NEXT:    [[Y_SHIFT_NOT:%.*]] = xor i8 [[Y_SHIFT]], -1741; CHECK-NEXT:    [[OR:%.*]] = or i8 [[X_SHIFT]], [[Y_SHIFT_NOT]]742; CHECK-NEXT:    ret i8 [[OR]]743;744  %x.shift = ashr i8 %x, %shamt745  %y.shift = lshr i8 %y, %shamt746  %y.shift.not = xor i8 %y.shift, -1747  %or = or i8 %x.shift, %y.shift.not748  ret i8 %or749}750 751; Negative test: invalid xor constant752 753define i8 @or_ashr_not_fail_invalid_xor_constant(i8 %x, i8 %y, i8 %shamt) {754; CHECK-LABEL: @or_ashr_not_fail_invalid_xor_constant(755; CHECK-NEXT:    [[X_SHIFT:%.*]] = ashr i8 [[X:%.*]], [[SHAMT:%.*]]756; CHECK-NEXT:    [[Y_SHIFT:%.*]] = ashr i8 [[Y:%.*]], [[SHAMT]]757; CHECK-NEXT:    [[Y_SHIFT_NOT:%.*]] = xor i8 [[Y_SHIFT]], -2758; CHECK-NEXT:    [[OR:%.*]] = or i8 [[X_SHIFT]], [[Y_SHIFT_NOT]]759; CHECK-NEXT:    ret i8 [[OR]]760;761  %x.shift = ashr i8 %x, %shamt762  %y.shift = ashr i8 %y, %shamt763  %y.shift.not = xor i8 %y.shift, -2764  %or = or i8 %x.shift, %y.shift.not765  ret i8 %or766}767 768define <4 x i8> @or_ashr_not_vec(<4 x i8> %x, <4 x i8> %y, <4 x i8> %shamt) {769; CHECK-LABEL: @or_ashr_not_vec(770; CHECK-NEXT:    [[TMP1:%.*]] = xor <4 x i8> [[Y:%.*]], splat (i8 -1)771; CHECK-NEXT:    [[TMP2:%.*]] = or <4 x i8> [[X:%.*]], [[TMP1]]772; CHECK-NEXT:    [[OR:%.*]] = ashr <4 x i8> [[TMP2]], [[SHAMT:%.*]]773; CHECK-NEXT:    ret <4 x i8> [[OR]]774;775  %x.shift = ashr <4 x i8> %x, %shamt776  %y.shift = ashr <4 x i8> %y, %shamt777  %y.shift.not = xor <4 x i8> %y.shift, <i8 -1, i8 -1, i8 -1, i8 -1>778  %or = or <4 x i8> %x.shift, %y.shift.not779  ret <4 x i8> %or780}781 782define <4 x i8> @or_ashr_not_vec_commuted(<4 x i8> %x, <4 x i8> %y, <4 x i8> %shamt) {783; CHECK-LABEL: @or_ashr_not_vec_commuted(784; CHECK-NEXT:    [[TMP1:%.*]] = xor <4 x i8> [[Y:%.*]], splat (i8 -1)785; CHECK-NEXT:    [[TMP2:%.*]] = or <4 x i8> [[X:%.*]], [[TMP1]]786; CHECK-NEXT:    [[OR:%.*]] = ashr <4 x i8> [[TMP2]], [[SHAMT:%.*]]787; CHECK-NEXT:    ret <4 x i8> [[OR]]788;789  %x.shift = ashr <4 x i8> %x, %shamt790  %y.shift = ashr <4 x i8> %y, %shamt791  %y.shift.not = xor <4 x i8> %y.shift, <i8 -1, i8 -1, i8 -1, i8 -1>792  %or = or <4 x i8> %y.shift.not, %x.shift793  ret <4 x i8> %or794}795 796define <4 x i8> @or_ashr_not_vec_poison_1(<4 x i8> %x, <4 x i8> %y, <4 x i8> %shamt) {797; CHECK-LABEL: @or_ashr_not_vec_poison_1(798; CHECK-NEXT:    [[TMP1:%.*]] = xor <4 x i8> [[Y:%.*]], splat (i8 -1)799; CHECK-NEXT:    [[TMP2:%.*]] = or <4 x i8> [[X:%.*]], [[TMP1]]800; CHECK-NEXT:    [[OR:%.*]] = ashr <4 x i8> [[TMP2]], [[SHAMT:%.*]]801; CHECK-NEXT:    ret <4 x i8> [[OR]]802;803  %x.shift = ashr <4 x i8> %x, %shamt804  %y.shift = ashr <4 x i8> %y, %shamt805  %y.shift.not = xor <4 x i8> %y.shift, <i8 -1, i8 poison, i8 poison, i8 poison>806  %or = or <4 x i8> %x.shift, %y.shift.not807  ret <4 x i8> %or808}809 810define <4 x i8> @or_ashr_not_vec_poison_2(<4 x i8> %x, <4 x i8> %y, <4 x i8> %shamt) {811; CHECK-LABEL: @or_ashr_not_vec_poison_2(812; CHECK-NEXT:    ret <4 x i8> poison813;814  %x.shift = ashr <4 x i8> %x, %shamt815  %y.shift = ashr <4 x i8> %y, %shamt816  %y.shift.not = xor <4 x i8> %y.shift, <i8 poison, i8 poison, i8 poison, i8 poison>817  %or = or <4 x i8> %x.shift, %y.shift.not818  ret <4 x i8> %or819}820 821; Fold (-x >> y) ^ ((x >> y) ^ -1) -> (-x ^ ~x) >> y822 823define i8 @xor_ashr_not(i8 %x, i8 %y, i8 %shamt) {824; CHECK-LABEL: @xor_ashr_not(825; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], [[X:%.*]]826; CHECK-NEXT:    [[DOTNOT:%.*]] = ashr i8 [[TMP1]], [[SHAMT:%.*]]827; CHECK-NEXT:    [[XOR:%.*]] = xor i8 [[DOTNOT]], -1828; CHECK-NEXT:    ret i8 [[XOR]]829;830  %x.shift = ashr i8 %x, %shamt831  %y.shift = ashr i8 %y, %shamt832  %y.shift.not = xor i8 %y.shift, -1833  %xor = xor i8 %x.shift, %y.shift.not834  ret i8 %xor835}836 837define i8 @xor_ashr_not_commuted(i8 %x, i8 %y, i8 %shamt) {838; CHECK-LABEL: @xor_ashr_not_commuted(839; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], [[X:%.*]]840; CHECK-NEXT:    [[DOTNOT:%.*]] = ashr i8 [[TMP1]], [[SHAMT:%.*]]841; CHECK-NEXT:    [[XOR:%.*]] = xor i8 [[DOTNOT]], -1842; CHECK-NEXT:    ret i8 [[XOR]]843;844  %x.shift = ashr i8 %x, %shamt845  %y.shift = ashr i8 %y, %shamt846  %y.shift.not = xor i8 %y.shift, -1847  %xor = xor i8 %y.shift.not, %x.shift848  ret i8 %xor849}850 851; Negative test: lshr instead of ashr852 853define i8 @xor_ashr_not_fail_lshr_ashr(i8 %x, i8 %y, i8 %shamt) {854; CHECK-LABEL: @xor_ashr_not_fail_lshr_ashr(855; CHECK-NEXT:    [[X_SHIFT:%.*]] = lshr i8 [[X:%.*]], [[SHAMT:%.*]]856; CHECK-NEXT:    [[Y_SHIFT:%.*]] = ashr i8 [[Y:%.*]], [[SHAMT]]857; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y_SHIFT]], [[X_SHIFT]]858; CHECK-NEXT:    [[XOR:%.*]] = xor i8 [[TMP1]], -1859; CHECK-NEXT:    ret i8 [[XOR]]860;861  %x.shift = lshr i8 %x, %shamt862  %y.shift = ashr i8 %y, %shamt863  %y.shift.not = xor i8 %y.shift, -1864  %xor = xor i8 %x.shift, %y.shift.not865  ret i8 %xor866}867 868; Negative test: lshr instead of ashr869 870define i8 @xor_ashr_not_fail_ashr_lshr(i8 %x, i8 %y, i8 %shamt) {871; CHECK-LABEL: @xor_ashr_not_fail_ashr_lshr(872; CHECK-NEXT:    [[X_SHIFT:%.*]] = ashr i8 [[X:%.*]], [[SHAMT:%.*]]873; CHECK-NEXT:    [[Y_SHIFT:%.*]] = lshr i8 [[Y:%.*]], [[SHAMT]]874; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y_SHIFT]], [[X_SHIFT]]875; CHECK-NEXT:    [[XOR:%.*]] = xor i8 [[TMP1]], -1876; CHECK-NEXT:    ret i8 [[XOR]]877;878  %x.shift = ashr i8 %x, %shamt879  %y.shift = lshr i8 %y, %shamt880  %y.shift.not = xor i8 %y.shift, -1881  %xor = xor i8 %x.shift, %y.shift.not882  ret i8 %xor883}884 885; Negative test: invalid xor constant886 887define i8 @xor_ashr_not_fail_invalid_xor_constant(i8 %x, i8 %y, i8 %shamt) {888; CHECK-LABEL: @xor_ashr_not_fail_invalid_xor_constant(889; CHECK-NEXT:    [[Y_SHIFT1:%.*]] = xor i8 [[Y:%.*]], [[X:%.*]]890; CHECK-NEXT:    [[TMP1:%.*]] = ashr i8 [[Y_SHIFT1]], [[SHAMT:%.*]]891; CHECK-NEXT:    [[XOR:%.*]] = xor i8 [[TMP1]], -2892; CHECK-NEXT:    ret i8 [[XOR]]893;894  %x.shift = ashr i8 %x, %shamt895  %y.shift = ashr i8 %y, %shamt896  %y.shift.not = xor i8 %y.shift, -2897  %xor = xor i8 %x.shift, %y.shift.not898  ret i8 %xor899}900 901define <4 x i8> @xor_ashr_not_vec(<4 x i8> %x, <4 x i8> %y, <4 x i8> %shamt) {902; CHECK-LABEL: @xor_ashr_not_vec(903; CHECK-NEXT:    [[TMP1:%.*]] = xor <4 x i8> [[Y:%.*]], [[X:%.*]]904; CHECK-NEXT:    [[DOTNOT:%.*]] = ashr <4 x i8> [[TMP1]], [[SHAMT:%.*]]905; CHECK-NEXT:    [[XOR:%.*]] = xor <4 x i8> [[DOTNOT]], splat (i8 -1)906; CHECK-NEXT:    ret <4 x i8> [[XOR]]907;908  %x.shift = ashr <4 x i8> %x, %shamt909  %y.shift = ashr <4 x i8> %y, %shamt910  %y.shift.not = xor <4 x i8> %y.shift, <i8 -1, i8 -1, i8 -1, i8 -1>911  %xor = xor <4 x i8> %x.shift, %y.shift.not912  ret <4 x i8> %xor913}914 915define <4 x i8> @xor_ashr_not_vec_commuted(<4 x i8> %x, <4 x i8> %y, <4 x i8> %shamt) {916; CHECK-LABEL: @xor_ashr_not_vec_commuted(917; CHECK-NEXT:    [[TMP1:%.*]] = xor <4 x i8> [[Y:%.*]], [[X:%.*]]918; CHECK-NEXT:    [[DOTNOT:%.*]] = ashr <4 x i8> [[TMP1]], [[SHAMT:%.*]]919; CHECK-NEXT:    [[XOR:%.*]] = xor <4 x i8> [[DOTNOT]], splat (i8 -1)920; CHECK-NEXT:    ret <4 x i8> [[XOR]]921;922  %x.shift = ashr <4 x i8> %x, %shamt923  %y.shift = ashr <4 x i8> %y, %shamt924  %y.shift.not = xor <4 x i8> %y.shift, <i8 -1, i8 -1, i8 -1, i8 -1>925  %xor = xor <4 x i8> %y.shift.not, %x.shift926  ret <4 x i8> %xor927}928 929define <4 x i8> @xor_ashr_not_vec_poison_1(<4 x i8> %x, <4 x i8> %y, <4 x i8> %shamt) {930; CHECK-LABEL: @xor_ashr_not_vec_poison_1(931; CHECK-NEXT:    [[TMP1:%.*]] = xor <4 x i8> [[Y:%.*]], [[X:%.*]]932; CHECK-NEXT:    [[DOTNOT:%.*]] = ashr <4 x i8> [[TMP1]], [[SHAMT:%.*]]933; CHECK-NEXT:    [[XOR:%.*]] = xor <4 x i8> [[DOTNOT]], splat (i8 -1)934; CHECK-NEXT:    ret <4 x i8> [[XOR]]935;936  %x.shift = ashr <4 x i8> %x, %shamt937  %y.shift = ashr <4 x i8> %y, %shamt938  %y.shift.not = xor <4 x i8> %y.shift, <i8 -1, i8 poison, i8 poison, i8 poison>939  %xor = xor <4 x i8> %x.shift, %y.shift.not940  ret <4 x i8> %xor941}942 943define <4 x i8> @xor_ashr_not_vec_poison_2(<4 x i8> %x, <4 x i8> %y, <4 x i8> %shamt) {944; CHECK-LABEL: @xor_ashr_not_vec_poison_2(945; CHECK-NEXT:    ret <4 x i8> poison946;947  %x.shift = ashr <4 x i8> %x, %shamt948  %y.shift = ashr <4 x i8> %y, %shamt949  %y.shift.not = xor <4 x i8> %y.shift, <i8 poison, i8 poison, i8 poison, i8 poison>950  %xor = xor <4 x i8> %x.shift, %y.shift.not951  ret <4 x i8> %xor952}953 954; Negative test: invalid binop955 956define i8 @binop_ashr_not_fail_invalid_binop(i8 %x, i8 %y, i8 %shamt) {957; CHECK-LABEL: @binop_ashr_not_fail_invalid_binop(958; CHECK-NEXT:    [[X_SHIFT:%.*]] = ashr i8 [[X:%.*]], [[SHAMT:%.*]]959; CHECK-NEXT:    [[Y_SHIFT:%.*]] = ashr i8 [[Y:%.*]], [[SHAMT]]960; CHECK-NEXT:    [[Y_SHIFT_NOT:%.*]] = xor i8 [[Y_SHIFT]], -1961; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[X_SHIFT]], [[Y_SHIFT_NOT]]962; CHECK-NEXT:    ret i8 [[ADD]]963;964  %x.shift = ashr i8 %x, %shamt965  %y.shift = ashr i8 %y, %shamt966  %y.shift.not = xor i8 %y.shift, -1967  %add = add i8 %x.shift, %y.shift.not968  ret i8 %add969}970