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