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