brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.8 KiB · 630d4ee Raw
750 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -passes=instcombine < %s 2>&1 | FileCheck %s3 4 5define i8 @umax_of_add_nuw_r(i8 %a, i8 %b, i8 %c) {6; CHECK-LABEL: define i8 @umax_of_add_nuw_r(7; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {8; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])9; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[TMP1]], [[A]]10; CHECK-NEXT:    ret i8 [[MAX]]11;12  %add1 = add nuw i8 %b, %a13  %add2 = add nuw i8 %c, %a14  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)15  ret i8 %max16}17 18define i8 @umax_of_add_nuw_l(i8 %a, i8 %b, i8 %c) {19; CHECK-LABEL: define i8 @umax_of_add_nuw_l(20; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {21; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])22; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[A]], [[TMP1]]23; CHECK-NEXT:    ret i8 [[MAX]]24;25  %add1 = add nuw i8 %a, %b26  %add2 = add nuw i8 %a, %c27  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)28  ret i8 %max29}30 31define i8 @umax_of_add_nuw_comm(i8 %a, i8 %b, i8 %c) {32; CHECK-LABEL: define i8 @umax_of_add_nuw_comm(33; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {34; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])35; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[TMP1]], [[A]]36; CHECK-NEXT:    ret i8 [[MAX]]37;38  %add1 = add nuw i8 %b, %a39  %add2 = add nuw i8 %a, %c40  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)41  ret i8 %max42}43 44define i8 @umax_of_add_nuw_nsw_lhs_r(i8 %a, i8 %b, i8 %c) {45; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_lhs_r(46; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {47; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])48; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[TMP1]], [[A]]49; CHECK-NEXT:    ret i8 [[MAX]]50;51  %add1 = add nuw nsw i8 %b, %a52  %add2 = add nuw i8 %c, %a53  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)54  ret i8 %max55}56 57define i8 @umax_of_add_nuw_nsw_lhs_l(i8 %a, i8 %b, i8 %c) {58; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_lhs_l(59; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {60; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])61; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[A]], [[TMP1]]62; CHECK-NEXT:    ret i8 [[MAX]]63;64  %add1 = add nuw nsw i8 %a, %b65  %add2 = add nuw i8 %a, %c66  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)67  ret i8 %max68}69 70define i8 @umax_of_add_nuw_nsw_lhs_comm(i8 %a, i8 %b, i8 %c) {71; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_lhs_comm(72; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {73; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])74; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[A]], [[TMP1]]75; CHECK-NEXT:    ret i8 [[MAX]]76;77  %add1 = add nuw nsw i8 %a, %b78  %add2 = add nuw i8 %c, %a79  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)80  ret i8 %max81}82 83define i8 @umax_of_add_nuw_nsw_rhs_r(i8 %a, i8 %b, i8 %c) {84; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_rhs_r(85; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {86; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])87; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[TMP1]], [[A]]88; CHECK-NEXT:    ret i8 [[MAX]]89;90  %add1 = add nuw i8 %b, %a91  %add2 = add nuw nsw i8 %c, %a92  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)93  ret i8 %max94}95 96define i8 @umax_of_add_nuw_nsw_rhs_l(i8 %a, i8 %b, i8 %c) {97; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_rhs_l(98; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {99; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])100; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[A]], [[TMP1]]101; CHECK-NEXT:    ret i8 [[MAX]]102;103  %add1 = add nuw i8 %a, %b104  %add2 = add nuw nsw i8 %a, %c105  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)106  ret i8 %max107}108 109define i8 @umax_of_add_nuw_nsw_rhs_comm(i8 %a, i8 %b, i8 %c) {110; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_rhs_comm(111; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {112; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])113; CHECK-NEXT:    [[MAX:%.*]] = add nuw i8 [[TMP1]], [[A]]114; CHECK-NEXT:    ret i8 [[MAX]]115;116  %add1 = add nuw i8 %b, %a117  %add2 = add nuw nsw i8 %a, %c118  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)119  ret i8 %max120}121 122define i8 @umax_of_add_nuw_nsw_r(i8 %a, i8 %b, i8 %c) {123; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_r(124; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {125; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])126; CHECK-NEXT:    [[MAX:%.*]] = add nuw nsw i8 [[TMP1]], [[A]]127; CHECK-NEXT:    ret i8 [[MAX]]128;129  %add1 = add nuw nsw i8 %b, %a130  %add2 = add nuw nsw i8 %c, %a131  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)132  ret i8 %max133}134 135define i8 @umax_of_add_nuw_nsw_l(i8 %a, i8 %b, i8 %c) {136; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_l(137; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {138; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])139; CHECK-NEXT:    [[MAX:%.*]] = add nuw nsw i8 [[A]], [[TMP1]]140; CHECK-NEXT:    ret i8 [[MAX]]141;142  %add1 = add nuw nsw i8 %a, %b143  %add2 = add nuw nsw i8 %a, %c144  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)145  ret i8 %max146}147 148define i8 @umax_of_add_nuw_nsw_comm(i8 %a, i8 %b, i8 %c) {149; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_comm(150; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {151; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 [[C]])152; CHECK-NEXT:    [[MAX:%.*]] = add nuw nsw i8 [[A]], [[TMP1]]153; CHECK-NEXT:    ret i8 [[MAX]]154;155  %add1 = add nuw nsw i8 %a, %b156  %add2 = add nuw nsw i8 %c, %a157  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)158  ret i8 %max159}160 161; negative test162define i8 @umax_of_add_nsw(i8 %a, i8 %b, i8 %c) {163; CHECK-LABEL: define i8 @umax_of_add_nsw(164; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {165; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i8 [[B]], [[A]]166; CHECK-NEXT:    [[ADD2:%.*]] = add nsw i8 [[C]], [[A]]167; CHECK-NEXT:    [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[ADD1]], i8 [[ADD2]])168; CHECK-NEXT:    ret i8 [[MAX]]169;170  %add1 = add nsw i8 %b, %a171  %add2 = add nsw i8 %c, %a172  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)173  ret i8 %max174}175 176; negative test177define i8 @umax_of_add(i8 %a, i8 %b, i8 %c) {178; CHECK-LABEL: define i8 @umax_of_add(179; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {180; CHECK-NEXT:    [[ADD1:%.*]] = add i8 [[B]], [[A]]181; CHECK-NEXT:    [[ADD2:%.*]] = add i8 [[C]], [[A]]182; CHECK-NEXT:    [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[ADD1]], i8 [[ADD2]])183; CHECK-NEXT:    ret i8 [[MAX]]184;185  %add1 = add i8 %b, %a186  %add2 = add i8 %c, %a187  %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2)188  ret i8 %max189}190 191define i8 @umin_of_add_nuw_r(i8 %a, i8 %b, i8 %c) {192; CHECK-LABEL: define i8 @umin_of_add_nuw_r(193; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {194; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])195; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]]196; CHECK-NEXT:    ret i8 [[MIN]]197;198  %add1 = add nuw i8 %b, %a199  %add2 = add nuw i8 %c, %a200  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)201  ret i8 %min202}203 204define i8 @umin_of_add_nuw_l(i8 %a, i8 %b, i8 %c) {205; CHECK-LABEL: define i8 @umin_of_add_nuw_l(206; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {207; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])208; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[A]], [[TMP1]]209; CHECK-NEXT:    ret i8 [[MIN]]210;211  %add1 = add nuw i8 %a, %b212  %add2 = add nuw i8 %a, %c213  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)214  ret i8 %min215}216 217define i8 @umin_of_add_nuw_comm(i8 %a, i8 %b, i8 %c) {218; CHECK-LABEL: define i8 @umin_of_add_nuw_comm(219; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {220; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])221; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]]222; CHECK-NEXT:    ret i8 [[MIN]]223;224  %add1 = add nuw i8 %b, %a225  %add2 = add nuw i8 %a, %c226  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)227  ret i8 %min228}229 230define i8 @umin_of_add_nuw_nsw_lhs_r(i8 %a, i8 %b, i8 %c) {231; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_lhs_r(232; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {233; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])234; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]]235; CHECK-NEXT:    ret i8 [[MIN]]236;237  %add1 = add nuw nsw i8 %b, %a238  %add2 = add nuw i8 %c, %a239  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)240  ret i8 %min241}242 243define i8 @umin_of_add_nuw_nsw_lhs_l(i8 %a, i8 %b, i8 %c) {244; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_lhs_l(245; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {246; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])247; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[A]], [[TMP1]]248; CHECK-NEXT:    ret i8 [[MIN]]249;250  %add1 = add nuw nsw i8 %a, %b251  %add2 = add nuw i8 %a, %c252  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)253  ret i8 %min254}255 256define i8 @umin_of_add_nuw_nsw_lhs_comm(i8 %a, i8 %b, i8 %c) {257; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_lhs_comm(258; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {259; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])260; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[A]], [[TMP1]]261; CHECK-NEXT:    ret i8 [[MIN]]262;263  %add1 = add nuw nsw i8 %a, %b264  %add2 = add nuw i8 %c, %a265  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)266  ret i8 %min267}268 269define i8 @umin_of_add_nuw_nsw_rhs_r(i8 %a, i8 %b, i8 %c) {270; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_rhs_r(271; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {272; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])273; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]]274; CHECK-NEXT:    ret i8 [[MIN]]275;276  %add1 = add nuw i8 %b, %a277  %add2 = add nuw nsw i8 %c, %a278  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)279  ret i8 %min280}281 282define i8 @umin_of_add_nuw_nsw_rhs_l(i8 %a, i8 %b, i8 %c) {283; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_rhs_l(284; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {285; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])286; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[A]], [[TMP1]]287; CHECK-NEXT:    ret i8 [[MIN]]288;289  %add1 = add nuw i8 %a, %b290  %add2 = add nuw nsw i8 %a, %c291  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)292  ret i8 %min293}294 295define i8 @umin_of_add_nuw_nsw_rhs_comm(i8 %a, i8 %b, i8 %c) {296; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_rhs_comm(297; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {298; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])299; CHECK-NEXT:    [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]]300; CHECK-NEXT:    ret i8 [[MIN]]301;302  %add1 = add nuw i8 %b, %a303  %add2 = add nuw nsw i8 %a, %c304  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)305  ret i8 %min306}307 308define i8 @umin_of_add_nuw_nsw_r(i8 %a, i8 %b, i8 %c) {309; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_r(310; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {311; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])312; CHECK-NEXT:    [[MIN:%.*]] = add nuw nsw i8 [[TMP1]], [[A]]313; CHECK-NEXT:    ret i8 [[MIN]]314;315  %add1 = add nuw nsw i8 %b, %a316  %add2 = add nuw nsw i8 %c, %a317  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)318  ret i8 %min319}320 321define i8 @umin_of_add_nuw_nsw_l(i8 %a, i8 %b, i8 %c) {322; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_l(323; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {324; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])325; CHECK-NEXT:    [[MIN:%.*]] = add nuw nsw i8 [[A]], [[TMP1]]326; CHECK-NEXT:    ret i8 [[MIN]]327;328  %add1 = add nuw nsw i8 %a, %b329  %add2 = add nuw nsw i8 %a, %c330  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)331  ret i8 %min332}333 334define i8 @umin_of_add_nuw_nsw_comm(i8 %a, i8 %b, i8 %c) {335; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_comm(336; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {337; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]])338; CHECK-NEXT:    [[MIN:%.*]] = add nuw nsw i8 [[A]], [[TMP1]]339; CHECK-NEXT:    ret i8 [[MIN]]340;341  %add1 = add nuw nsw i8 %a, %b342  %add2 = add nuw nsw i8 %c, %a343  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)344  ret i8 %min345}346 347; negative test348define i8 @umin_of_add_nsw(i8 %a, i8 %b, i8 %c) {349; CHECK-LABEL: define i8 @umin_of_add_nsw(350; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {351; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i8 [[B]], [[A]]352; CHECK-NEXT:    [[ADD2:%.*]] = add nsw i8 [[C]], [[A]]353; CHECK-NEXT:    [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[ADD1]], i8 [[ADD2]])354; CHECK-NEXT:    ret i8 [[MIN]]355;356  %add1 = add nsw i8 %b, %a357  %add2 = add nsw i8 %c, %a358  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)359  ret i8 %min360}361 362; negative test363define i8 @umin_of_add(i8 %a, i8 %b, i8 %c) {364; CHECK-LABEL: define i8 @umin_of_add(365; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {366; CHECK-NEXT:    [[ADD1:%.*]] = add i8 [[B]], [[A]]367; CHECK-NEXT:    [[ADD2:%.*]] = add i8 [[C]], [[A]]368; CHECK-NEXT:    [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[ADD1]], i8 [[ADD2]])369; CHECK-NEXT:    ret i8 [[MIN]]370;371  %add1 = add i8 %b, %a372  %add2 = add i8 %c, %a373  %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2)374  ret i8 %min375}376 377; negative test378define i8 @smax_of_add_nuw(i8 %a, i8 %b, i8 %c) {379; CHECK-LABEL: define i8 @smax_of_add_nuw(380; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {381; CHECK-NEXT:    [[ADD1:%.*]] = add nuw i8 [[B]], [[A]]382; CHECK-NEXT:    [[ADD2:%.*]] = add nuw i8 [[C]], [[A]]383; CHECK-NEXT:    [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[ADD1]], i8 [[ADD2]])384; CHECK-NEXT:    ret i8 [[MAX]]385;386  %add1 = add nuw i8 %b, %a387  %add2 = add nuw i8 %c, %a388  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)389  ret i8 %max390}391 392define i8 @smax_of_add_nsw_r(i8 %a, i8 %b, i8 %c) {393; CHECK-LABEL: define i8 @smax_of_add_nsw_r(394; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {395; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])396; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]]397; CHECK-NEXT:    ret i8 [[MAX]]398;399  %add1 = add nsw i8 %b, %a400  %add2 = add nsw i8 %c, %a401  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)402  ret i8 %max403}404 405define i8 @smax_of_add_nsw_l(i8 %a, i8 %b, i8 %c) {406; CHECK-LABEL: define i8 @smax_of_add_nsw_l(407; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {408; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])409; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[A]], [[TMP1]]410; CHECK-NEXT:    ret i8 [[MAX]]411;412  %add1 = add nsw i8 %a, %b413  %add2 = add nsw i8 %a, %c414  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)415  ret i8 %max416}417 418define i8 @smax_of_add_nsw_comm(i8 %a, i8 %b, i8 %c) {419; CHECK-LABEL: define i8 @smax_of_add_nsw_comm(420; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {421; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])422; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]]423; CHECK-NEXT:    ret i8 [[MAX]]424;425  %add1 = add nsw i8 %b, %a426  %add2 = add nsw i8 %a, %c427  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)428  ret i8 %max429}430 431define i8 @smax_of_add_nsw_nuw_lhs_r(i8 %a, i8 %b, i8 %c) {432; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_lhs_r(433; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {434; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])435; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]]436; CHECK-NEXT:    ret i8 [[MAX]]437;438  %add1 = add nsw nuw i8 %b, %a439  %add2 = add nsw i8 %c, %a440  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)441  ret i8 %max442}443 444define i8 @smax_of_add_nsw_nuw_lhs_l(i8 %a, i8 %b, i8 %c) {445; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_lhs_l(446; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {447; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])448; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[A]], [[TMP1]]449; CHECK-NEXT:    ret i8 [[MAX]]450;451  %add1 = add nsw nuw i8 %a, %b452  %add2 = add nsw i8 %a, %c453  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)454  ret i8 %max455}456 457define i8 @smax_of_add_nsw_nuw_lhs_comm(i8 %a, i8 %b, i8 %c) {458; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_lhs_comm(459; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {460; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])461; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[A]], [[TMP1]]462; CHECK-NEXT:    ret i8 [[MAX]]463;464  %add1 = add nuw nsw i8 %a, %b465  %add2 = add nsw i8 %c, %a466  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)467  ret i8 %max468}469 470define i8 @smax_of_add_nsw_nuw_rhs_r(i8 %a, i8 %b, i8 %c) {471; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_rhs_r(472; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {473; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])474; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]]475; CHECK-NEXT:    ret i8 [[MAX]]476;477  %add1 = add nsw i8 %b, %a478  %add2 = add nsw nuw i8 %c, %a479  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)480  ret i8 %max481}482 483define i8 @smax_of_add_nsw_nuw_rhs_l(i8 %a, i8 %b, i8 %c) {484; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_rhs_l(485; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {486; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])487; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[A]], [[TMP1]]488; CHECK-NEXT:    ret i8 [[MAX]]489;490  %add1 = add nsw i8 %a, %b491  %add2 = add nsw nuw i8 %a, %c492  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)493  ret i8 %max494}495 496define i8 @smax_of_add_nsw_nuw_rhs_comm(i8 %a, i8 %b, i8 %c) {497; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_rhs_comm(498; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {499; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])500; CHECK-NEXT:    [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]]501; CHECK-NEXT:    ret i8 [[MAX]]502;503  %add1 = add nsw i8 %b, %a504  %add2 = add nsw nuw i8 %a, %c505  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)506  ret i8 %max507}508 509define i8 @smax_of_add_nsw_nuw_r(i8 %a, i8 %b, i8 %c) {510; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_r(511; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {512; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])513; CHECK-NEXT:    [[MAX:%.*]] = add nuw nsw i8 [[TMP1]], [[A]]514; CHECK-NEXT:    ret i8 [[MAX]]515;516  %add1 = add nsw nuw i8 %b, %a517  %add2 = add nsw nuw i8 %c, %a518  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)519  ret i8 %max520}521 522define i8 @smax_of_add_nsw_nuw_l(i8 %a, i8 %b, i8 %c) {523; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_l(524; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {525; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])526; CHECK-NEXT:    [[MAX:%.*]] = add nuw nsw i8 [[A]], [[TMP1]]527; CHECK-NEXT:    ret i8 [[MAX]]528;529  %add1 = add nsw nuw i8 %a, %b530  %add2 = add nsw nuw i8 %a, %c531  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)532  ret i8 %max533}534 535define i8 @smax_of_add_nsw_nuw_comm(i8 %a, i8 %b, i8 %c) {536; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_comm(537; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {538; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]])539; CHECK-NEXT:    [[MAX:%.*]] = add nuw nsw i8 [[A]], [[TMP1]]540; CHECK-NEXT:    ret i8 [[MAX]]541;542  %add1 = add nsw nuw i8 %a, %b543  %add2 = add nsw nuw i8 %c, %a544  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)545  ret i8 %max546}547 548; negative test549define i8 @smax_of_add(i8 %a, i8 %b, i8 %c) {550; CHECK-LABEL: define i8 @smax_of_add(551; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {552; CHECK-NEXT:    [[ADD1:%.*]] = add i8 [[B]], [[A]]553; CHECK-NEXT:    [[ADD2:%.*]] = add i8 [[C]], [[A]]554; CHECK-NEXT:    [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[ADD1]], i8 [[ADD2]])555; CHECK-NEXT:    ret i8 [[MAX]]556;557  %add1 = add i8 %b, %a558  %add2 = add i8 %c, %a559  %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2)560  ret i8 %max561}562 563; negative test564define i8 @smin_of_add_nuw(i8 %a, i8 %b, i8 %c) {565; CHECK-LABEL: define i8 @smin_of_add_nuw(566; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {567; CHECK-NEXT:    [[ADD1:%.*]] = add nuw i8 [[B]], [[A]]568; CHECK-NEXT:    [[ADD2:%.*]] = add nuw i8 [[C]], [[A]]569; CHECK-NEXT:    [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[ADD1]], i8 [[ADD2]])570; CHECK-NEXT:    ret i8 [[MIN]]571;572  %add1 = add nuw i8 %b, %a573  %add2 = add nuw i8 %c, %a574  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)575  ret i8 %min576}577 578define i8 @smin_of_add_nsw_r(i8 %a, i8 %b, i8 %c) {579; CHECK-LABEL: define i8 @smin_of_add_nsw_r(580; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {581; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])582; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]]583; CHECK-NEXT:    ret i8 [[MIN]]584;585  %add1 = add nsw i8 %b, %a586  %add2 = add nsw i8 %c, %a587  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)588  ret i8 %min589}590 591define i8 @smin_of_add_nsw_l(i8 %a, i8 %b, i8 %c) {592; CHECK-LABEL: define i8 @smin_of_add_nsw_l(593; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {594; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])595; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[A]], [[TMP1]]596; CHECK-NEXT:    ret i8 [[MIN]]597;598  %add1 = add nsw i8 %a, %b599  %add2 = add nsw i8 %a, %c600  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)601  ret i8 %min602}603 604define i8 @smin_of_add_nsw_comm(i8 %a, i8 %b, i8 %c) {605; CHECK-LABEL: define i8 @smin_of_add_nsw_comm(606; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {607; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])608; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]]609; CHECK-NEXT:    ret i8 [[MIN]]610;611  %add1 = add nsw i8 %b, %a612  %add2 = add nsw i8 %a, %c613  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)614  ret i8 %min615}616 617define i8 @smin_of_add_nsw_nuw_lhs_r(i8 %a, i8 %b, i8 %c) {618; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_lhs_r(619; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {620; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])621; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]]622; CHECK-NEXT:    ret i8 [[MIN]]623;624  %add1 = add nsw nuw i8 %b, %a625  %add2 = add nsw i8 %c, %a626  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)627  ret i8 %min628}629 630define i8 @smin_of_add_nsw_nuw_lhs_l(i8 %a, i8 %b, i8 %c) {631; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_lhs_l(632; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {633; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])634; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[A]], [[TMP1]]635; CHECK-NEXT:    ret i8 [[MIN]]636;637  %add1 = add nsw nuw i8 %a, %b638  %add2 = add nsw i8 %a, %c639  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)640  ret i8 %min641}642 643define i8 @smin_of_add_nsw_nuw_lhs_comm(i8 %a, i8 %b, i8 %c) {644; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_lhs_comm(645; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {646; CHECK-NEXT:    [[ADD1:%.*]] = add nuw nsw i8 [[A]], [[B]]647; CHECK-NEXT:    [[ADD2:%.*]] = add nuw i8 [[C]], [[A]]648; CHECK-NEXT:    [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[ADD1]], i8 [[ADD2]])649; CHECK-NEXT:    ret i8 [[MIN]]650;651  %add1 = add nsw nuw i8 %a, %b652  %add2 = add nuw i8 %c, %a653  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)654  ret i8 %min655}656 657define i8 @smin_of_add_nsw_nuw_rhs_r(i8 %a, i8 %b, i8 %c) {658; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_rhs_r(659; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {660; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])661; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]]662; CHECK-NEXT:    ret i8 [[MIN]]663;664  %add1 = add nsw i8 %b, %a665  %add2 = add nsw nuw i8 %c, %a666  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)667  ret i8 %min668}669 670define i8 @smin_of_add_nsw_nuw_rhs_l(i8 %a, i8 %b, i8 %c) {671; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_rhs_l(672; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {673; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])674; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[A]], [[TMP1]]675; CHECK-NEXT:    ret i8 [[MIN]]676;677  %add1 = add nsw i8 %a, %b678  %add2 = add nsw nuw i8 %a, %c679  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)680  ret i8 %min681}682 683define i8 @smin_of_add_nsw_nuw_rhs_comm(i8 %a, i8 %b, i8 %c) {684; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_rhs_comm(685; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {686; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])687; CHECK-NEXT:    [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]]688; CHECK-NEXT:    ret i8 [[MIN]]689;690  %add1 = add nsw i8 %b, %a691  %add2 = add nsw nuw i8 %a, %c692  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)693  ret i8 %min694}695 696 697define i8 @smin_of_add_nsw_nuw_r(i8 %a, i8 %b, i8 %c) {698; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_r(699; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {700; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])701; CHECK-NEXT:    [[MIN:%.*]] = add nuw nsw i8 [[TMP1]], [[A]]702; CHECK-NEXT:    ret i8 [[MIN]]703;704  %add1 = add nsw nuw i8 %b, %a705  %add2 = add nsw nuw i8 %c, %a706  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)707  ret i8 %min708}709 710define i8 @smin_of_add_nsw_nuw_l(i8 %a, i8 %b, i8 %c) {711; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_l(712; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {713; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])714; CHECK-NEXT:    [[MIN:%.*]] = add nuw nsw i8 [[A]], [[TMP1]]715; CHECK-NEXT:    ret i8 [[MIN]]716;717  %add1 = add nsw nuw i8 %a, %b718  %add2 = add nsw nuw i8 %a, %c719  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)720  ret i8 %min721}722 723define i8 @smin_of_add_nsw_nuw_comm(i8 %a, i8 %b, i8 %c) {724; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_comm(725; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {726; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]])727; CHECK-NEXT:    [[MIN:%.*]] = add nuw nsw i8 [[A]], [[TMP1]]728; CHECK-NEXT:    ret i8 [[MIN]]729;730  %add1 = add nsw nuw i8 %a, %b731  %add2 = add nsw nuw i8 %c, %a732  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)733  ret i8 %min734}735 736; negative test737define i8 @smin_of_add(i8 %a, i8 %b, i8 %c) {738; CHECK-LABEL: define i8 @smin_of_add(739; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) {740; CHECK-NEXT:    [[ADD1:%.*]] = add i8 [[B]], [[A]]741; CHECK-NEXT:    [[ADD2:%.*]] = add i8 [[C]], [[A]]742; CHECK-NEXT:    [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[ADD1]], i8 [[ADD2]])743; CHECK-NEXT:    ret i8 [[MIN]]744;745  %add1 = add i8 %b, %a746  %add2 = add i8 %c, %a747  %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2)748  ret i8 %min749}750