brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.3 KiB · e10f83f Raw
360 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4define i8 @shl_or(i8 %x) {5; CHECK-LABEL: define i8 @shl_or6; CHECK-SAME: (i8 [[X:%.*]]) {7; CHECK-NEXT:    [[BINOP:%.*]] = shl i8 22, [[X]]8; CHECK-NEXT:    ret i8 [[BINOP]]9;10  %shift = shl i8 16, %x11  %add = add i8 %x, 112  %shift2 = shl i8 3, %add13  %binop = or i8 %shift, %shift214  ret i8 %binop15}16 17define i8 @lshr_or(i8 %x) {18; CHECK-LABEL: define i8 @lshr_or19; CHECK-SAME: (i8 [[X:%.*]]) {20; CHECK-NEXT:    [[BINOP:%.*]] = lshr i8 17, [[X]]21; CHECK-NEXT:    ret i8 [[BINOP]]22;23  %shift = lshr i8 16, %x24  %add = add i8 %x, 125  %shift2 = lshr i8 3, %add26  %binop = or i8 %shift, %shift227  ret i8 %binop28}29 30define i8 @ashr_or(i8 %x) {31; CHECK-LABEL: define i8 @ashr_or32; CHECK-SAME: (i8 [[X:%.*]]) {33; CHECK-NEXT:    [[BINOP:%.*]] = ashr i8 -64, [[X]]34; CHECK-NEXT:    ret i8 [[BINOP]]35;36  %shift = ashr i8 -64, %x37  %add = add i8 %x, 138  %shift2 = ashr i8 -128, %add39  %binop = or i8 %shift, %shift240  ret i8 %binop41}42 43define i8 @shl_xor(i8 %x) {44; CHECK-LABEL: define i8 @shl_xor45; CHECK-SAME: (i8 [[X:%.*]]) {46; CHECK-NEXT:    [[BINOP:%.*]] = shl i8 22, [[X]]47; CHECK-NEXT:    ret i8 [[BINOP]]48;49  %shift = shl i8 16, %x50  %add = add i8 %x, 151  %shift2 = shl i8 3, %add52  %binop = xor i8 %shift, %shift253  ret i8 %binop54}55 56define i8 @lshr_xor(i8 %x) {57; CHECK-LABEL: define i8 @lshr_xor58; CHECK-SAME: (i8 [[X:%.*]]) {59; CHECK-NEXT:    [[BINOP:%.*]] = lshr i8 17, [[X]]60; CHECK-NEXT:    ret i8 [[BINOP]]61;62  %shift = lshr i8 16, %x63  %add = add i8 %x, 164  %shift2 = lshr i8 3, %add65  %binop = xor i8 %shift, %shift266  ret i8 %binop67}68 69define i8 @ashr_xor(i8 %x) {70; CHECK-LABEL: define i8 @ashr_xor71; CHECK-SAME: (i8 [[X:%.*]]) {72; CHECK-NEXT:    [[BINOP:%.*]] = lshr i8 96, [[X]]73; CHECK-NEXT:    ret i8 [[BINOP]]74;75  %shift = ashr i8 -128, %x76  %add = add i8 %x, 177  %shift2 = ashr i8 -64, %add78  %binop = xor i8 %shift, %shift279  ret i8 %binop80}81 82define i8 @shl_and(i8 %x) {83; CHECK-LABEL: define i8 @shl_and84; CHECK-SAME: (i8 [[X:%.*]]) {85; CHECK-NEXT:    [[BINOP:%.*]] = shl i8 16, [[X]]86; CHECK-NEXT:    ret i8 [[BINOP]]87;88  %shift = shl i8 48, %x89  %add = add i8 %x, 190  %shift2 = shl i8 8, %add91  %binop = and i8 %shift, %shift292  ret i8 %binop93}94 95define i8 @lshr_and(i8 %x) {96; CHECK-LABEL: define i8 @lshr_and97; CHECK-SAME: (i8 [[X:%.*]]) {98; CHECK-NEXT:    [[BINOP:%.*]] = lshr i8 32, [[X]]99; CHECK-NEXT:    ret i8 [[BINOP]]100;101  %shift = lshr i8 48, %x102  %add = add i8 %x, 1103  %shift2 = lshr i8 64, %add104  %binop = and i8 %shift, %shift2105  ret i8 %binop106}107 108define i8 @ashr_and(i8 %x) {109; CHECK-LABEL: define i8 @ashr_and110; CHECK-SAME: (i8 [[X:%.*]]) {111; CHECK-NEXT:    [[BINOP:%.*]] = ashr i8 -64, [[X]]112; CHECK-NEXT:    ret i8 [[BINOP]]113;114  %shift = ashr i8 -64, %x115  %add = add i8 %x, 1116  %shift2 = ashr i8 -128, %add117  %binop = and i8 %shift, %shift2118  ret i8 %binop119}120 121define i8 @shl_add(i8 %x) {122; CHECK-LABEL: define i8 @shl_add123; CHECK-SAME: (i8 [[X:%.*]]) {124; CHECK-NEXT:    [[BINOP:%.*]] = shl i8 30, [[X]]125; CHECK-NEXT:    ret i8 [[BINOP]]126;127  %shift = shl i8 16, %x128  %add = add i8 %x, 1129  %shift2 = shl i8 7, %add130  %binop = add i8 %shift, %shift2131  ret i8 %binop132}133 134define i8 @lshr_add_fail(i8 %x) {135; CHECK-LABEL: define i8 @lshr_add_fail136; CHECK-SAME: (i8 [[X:%.*]]) {137; CHECK-NEXT:    [[SHIFT:%.*]] = lshr i8 16, [[X]]138; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[X]], 1139; CHECK-NEXT:    [[SHIFT2:%.*]] = lshr i8 7, [[ADD]]140; CHECK-NEXT:    [[BINOP:%.*]] = add nuw nsw i8 [[SHIFT]], [[SHIFT2]]141; CHECK-NEXT:    ret i8 [[BINOP]]142;143  %shift = lshr i8 16, %x144  %add = add i8 %x, 1145  %shift2 = lshr i8 7, %add146  %binop = add i8 %shift, %shift2147  ret i8 %binop148}149 150define i8 @ashr_add_fail(i8 %x) {151; CHECK-LABEL: define i8 @ashr_add_fail152; CHECK-SAME: (i8 [[X:%.*]]) {153; CHECK-NEXT:    [[SHIFT:%.*]] = ashr exact i8 -128, [[X]]154; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[X]], 1155; CHECK-NEXT:    [[SHIFT2:%.*]] = ashr exact i8 -128, [[ADD]]156; CHECK-NEXT:    [[BINOP:%.*]] = add i8 [[SHIFT]], [[SHIFT2]]157; CHECK-NEXT:    ret i8 [[BINOP]]158;159  %shift = ashr i8 -128, %x160  %add = add i8 %x, 1161  %shift2 = ashr i8 -128, %add162  %binop = add i8 %shift, %shift2163  ret i8 %binop164}165 166define i8 @shl_or_commuted(i8 %x) {167; CHECK-LABEL: define i8 @shl_or_commuted168; CHECK-SAME: (i8 [[X:%.*]]) {169; CHECK-NEXT:    [[BINOP:%.*]] = shl i8 22, [[X]]170; CHECK-NEXT:    ret i8 [[BINOP]]171;172  %shift = shl i8 16, %x173  %add = add i8 %x, 1174  %shift2 = shl i8 3, %add175  %binop = or i8 %shift2, %shift176  ret i8 %binop177}178 179define <2 x i8> @shl_or_splat(<2 x i8> %x) {180; CHECK-LABEL: define <2 x i8> @shl_or_splat181; CHECK-SAME: (<2 x i8> [[X:%.*]]) {182; CHECK-NEXT:    [[BINOP:%.*]] = shl <2 x i8> splat (i8 22), [[X]]183; CHECK-NEXT:    ret <2 x i8> [[BINOP]]184;185  %shift = shl <2 x i8> <i8 16, i8 16>, %x186  %add = add <2 x i8> %x, <i8 1, i8 1>187  %shift2 = shl <2 x i8> <i8 3, i8 3>, %add188  %binop = or <2 x i8> %shift, %shift2189  ret <2 x i8> %binop190}191 192define <2 x i8> @shl_or_non_splat(<2 x i8> %x) {193; CHECK-LABEL: define <2 x i8> @shl_or_non_splat194; CHECK-SAME: (<2 x i8> [[X:%.*]]) {195; CHECK-NEXT:    [[BINOP:%.*]] = shl <2 x i8> <i8 22, i8 60>, [[X]]196; CHECK-NEXT:    ret <2 x i8> [[BINOP]]197;198  %shift = shl <2 x i8> <i8 16, i8 32>, %x199  %add = add <2 x i8> %x, <i8 1, i8 2>200  %shift2 = shl <2 x i8> <i8 3, i8 7>, %add201  %binop = or <2 x i8> %shift, %shift2202  ret <2 x i8> %binop203}204 205define <2 x i8> @shl_or_poison_in_add(<2 x i8> %x) {206; CHECK-LABEL: define <2 x i8> @shl_or_poison_in_add207; CHECK-SAME: (<2 x i8> [[X:%.*]]) {208; CHECK-NEXT:    [[BINOP:%.*]] = shl <2 x i8> <i8 22, i8 poison>, [[X]]209; CHECK-NEXT:    ret <2 x i8> [[BINOP]]210;211  %shift = shl <2 x i8> <i8 16, i8 16>, %x212  %add = add <2 x i8> %x, <i8 1, i8 poison>213  %shift2 = shl <2 x i8> <i8 3, i8 3>, %add214  %binop = or <2 x i8> %shift, %shift2215  ret <2 x i8> %binop216}217 218define <2 x i8> @shl_or_poison_in_shift1(<2 x i8> %x) {219; CHECK-LABEL: define <2 x i8> @shl_or_poison_in_shift1220; CHECK-SAME: (<2 x i8> [[X:%.*]]) {221; CHECK-NEXT:    [[BINOP:%.*]] = shl <2 x i8> <i8 22, i8 poison>, [[X]]222; CHECK-NEXT:    ret <2 x i8> [[BINOP]]223;224  %shift = shl <2 x i8> <i8 16, i8 poison>, %x225  %add = add <2 x i8> %x, <i8 1, i8 1>226  %shift2 = shl <2 x i8> <i8 3, i8 3>, %add227  %binop = or <2 x i8> %shift, %shift2228  ret <2 x i8> %binop229}230 231define <2 x i8> @shl_or_poison_in_shift2(<2 x i8> %x) {232; CHECK-LABEL: define <2 x i8> @shl_or_poison_in_shift2233; CHECK-SAME: (<2 x i8> [[X:%.*]]) {234; CHECK-NEXT:    [[BINOP:%.*]] = shl <2 x i8> <i8 22, i8 poison>, [[X]]235; CHECK-NEXT:    ret <2 x i8> [[BINOP]]236;237  %shift = shl <2 x i8> <i8 16, i8 16>, %x238  %add = add <2 x i8> %x, <i8 1, i8 1>239  %shift2 = shl <2 x i8> <i8 3, i8 poison>, %add240  %binop = or <2 x i8> %shift, %shift2241  ret <2 x i8> %binop242}243 244declare void @use(i8)245 246define i8 @shl_or_multiuse(i8 %x) {247; CHECK-LABEL: define i8 @shl_or_multiuse248; CHECK-SAME: (i8 [[X:%.*]]) {249; CHECK-NEXT:    [[SHIFT:%.*]] = shl i8 16, [[X]]250; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[X]], 1251; CHECK-NEXT:    [[SHIFT2:%.*]] = shl i8 3, [[ADD]]252; CHECK-NEXT:    call void @use(i8 [[SHIFT]])253; CHECK-NEXT:    call void @use(i8 [[ADD]])254; CHECK-NEXT:    call void @use(i8 [[SHIFT2]])255; CHECK-NEXT:    [[BINOP:%.*]] = shl i8 22, [[X]]256; CHECK-NEXT:    ret i8 [[BINOP]]257;258  %shift = shl i8 16, %x259  %add = add i8 %x, 1260  %shift2 = shl i8 3, %add261  call void @use(i8 %shift)262  call void @use(i8 %add)263  call void @use(i8 %shift2)264  %binop = or i8 %shift, %shift2265  ret i8 %binop266}267 268define i8 @mismatched_shifts(i8 %x) {269; CHECK-LABEL: define i8 @mismatched_shifts270; CHECK-SAME: (i8 [[X:%.*]]) {271; CHECK-NEXT:    [[SHIFT:%.*]] = shl i8 16, [[X]]272; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[X]], 1273; CHECK-NEXT:    [[SHIFT2:%.*]] = lshr i8 3, [[ADD]]274; CHECK-NEXT:    [[BINOP:%.*]] = or disjoint i8 [[SHIFT]], [[SHIFT2]]275; CHECK-NEXT:    ret i8 [[BINOP]]276;277  %shift = shl i8 16, %x278  %add = add i8 %x, 1279  %shift2 = lshr i8 3, %add280  %binop = or i8 %shift, %shift2281  ret i8 %binop282}283 284define i8 @mismatched_ops(i8 %x, i8 %y) {285; CHECK-LABEL: define i8 @mismatched_ops286; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) {287; CHECK-NEXT:    [[SHIFT:%.*]] = shl i8 16, [[X]]288; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[Y]], 1289; CHECK-NEXT:    [[SHIFT2:%.*]] = shl i8 3, [[ADD]]290; CHECK-NEXT:    [[BINOP:%.*]] = or i8 [[SHIFT]], [[SHIFT2]]291; CHECK-NEXT:    ret i8 [[BINOP]]292;293  %shift = shl i8 16, %x294  %add = add i8 %y, 1295  %shift2 = shl i8 3, %add296  %binop = or i8 %shift, %shift2297  ret i8 %binop298}299 300define i8 @add_out_of_range(i8 %x) {301; CHECK-LABEL: define i8 @add_out_of_range302; CHECK-SAME: (i8 [[X:%.*]]) {303; CHECK-NEXT:    [[SHIFT:%.*]] = shl i8 16, [[X]]304; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[X]], 32305; CHECK-NEXT:    [[SHIFT2:%.*]] = shl i8 3, [[ADD]]306; CHECK-NEXT:    [[BINOP:%.*]] = or i8 [[SHIFT]], [[SHIFT2]]307; CHECK-NEXT:    ret i8 [[BINOP]]308;309  %shift = shl i8 16, %x310  %add = add i8 %x, 32311  %shift2 = shl i8 3, %add312  %binop = or i8 %shift, %shift2313  ret i8 %binop314}315 316define <2 x i8> @shl_or_non_splat_out_of_range(<2 x i8> %x) {317; CHECK-LABEL: define <2 x i8> @shl_or_non_splat_out_of_range318; CHECK-SAME: (<2 x i8> [[X:%.*]]) {319; CHECK-NEXT:    [[SHIFT:%.*]] = shl <2 x i8> <i8 16, i8 32>, [[X]]320; CHECK-NEXT:    [[ADD:%.*]] = add <2 x i8> [[X]], <i8 1, i8 32>321; CHECK-NEXT:    [[SHIFT2:%.*]] = shl <2 x i8> <i8 3, i8 7>, [[ADD]]322; CHECK-NEXT:    [[BINOP:%.*]] = or <2 x i8> [[SHIFT]], [[SHIFT2]]323; CHECK-NEXT:    ret <2 x i8> [[BINOP]]324;325  %shift = shl <2 x i8> <i8 16, i8 32>, %x326  %add = add <2 x i8> %x, <i8 1, i8 32>327  %shift2 = shl <2 x i8> <i8 3, i8 7>, %add328  %binop = or <2 x i8> %shift, %shift2329  ret <2 x i8> %binop330}331 332define i8 @shl_or_with_or_disjoint_instead_of_add(i8 %x) {333; CHECK-LABEL: define i8 @shl_or_with_or_disjoint_instead_of_add334; CHECK-SAME: (i8 [[X:%.*]]) {335; CHECK-NEXT:    [[BINOP:%.*]] = shl i8 22, [[X]]336; CHECK-NEXT:    ret i8 [[BINOP]]337;338  %shift = shl i8 16, %x339  %add = or disjoint i8 %x, 1340  %shift2 = shl i8 3, %add341  %binop = or i8 %shift, %shift2342  ret i8 %binop343}344 345define i8 @shl_or_with_or_instead_of_add(i8 %x) {346; CHECK-LABEL: define i8 @shl_or_with_or_instead_of_add347; CHECK-SAME: (i8 [[X:%.*]]) {348; CHECK-NEXT:    [[SHIFT:%.*]] = shl i8 16, [[X]]349; CHECK-NEXT:    [[ADD:%.*]] = or i8 [[X]], 1350; CHECK-NEXT:    [[SHIFT2:%.*]] = shl i8 3, [[ADD]]351; CHECK-NEXT:    [[BINOP:%.*]] = or i8 [[SHIFT]], [[SHIFT2]]352; CHECK-NEXT:    ret i8 [[BINOP]]353;354  %shift = shl i8 16, %x355  %add = or i8 %x, 1356  %shift2 = shl i8 3, %add357  %binop = or i8 %shift, %shift2358  ret i8 %binop359}360