1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2; RUN: opt -S -passes=instcombine < %s 2>&1 | FileCheck %s 3 4 5define i8 @umax_of_add_nuw(i8 %a, i8 %b, i8 %c) { 6; CHECK-LABEL: define i8 @umax_of_add_nuw( 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, %a 13 %add2 = add nuw i8 %c, %a 14 %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2) 15 ret i8 %max 16} 17 18define i8 @umax_of_add_nuw_comm(i8 %a, i8 %b, i8 %c) { 19; CHECK-LABEL: define i8 @umax_of_add_nuw_comm( 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 [[TMP1]], [[A]] 23; CHECK-NEXT: ret i8 [[MAX]] 24; 25 %add1 = add nuw i8 %a, %b 26 %add2 = add nuw i8 %a, %c 27 %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2) 28 ret i8 %max 29} 30 31define i8 @umax_of_add_nuw_nsw_lhs(i8 %a, i8 %b, i8 %c) { 32; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_lhs( 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 nsw i8 %b, %a 39 %add2 = add nuw i8 %c, %a 40 %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2) 41 ret i8 %max 42} 43 44define i8 @umax_of_add_nuw_nsw_lhs_comm(i8 %a, i8 %b, i8 %c) { 45; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_lhs_comm( 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 %a, %b 52 %add2 = add nuw i8 %a, %c 53 %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2) 54 ret i8 %max 55} 56 57define i8 @umax_of_add_nuw_nsw_rhs(i8 %a, i8 %b, i8 %c) { 58; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_rhs( 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 [[TMP1]], [[A]] 62; CHECK-NEXT: ret i8 [[MAX]] 63; 64 %add1 = add nuw i8 %b, %a 65 %add2 = add nuw nsw i8 %c, %a 66 %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2) 67 ret i8 %max 68} 69 70define i8 @umax_of_add_nuw_nsw_rhs_comm(i8 %a, i8 %b, i8 %c) { 71; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_rhs_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 [[TMP1]], [[A]] 75; CHECK-NEXT: ret i8 [[MAX]] 76; 77 %add1 = add nuw i8 %a, %b 78 %add2 = add nuw nsw i8 %a, %c 79 %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2) 80 ret i8 %max 81} 82 83define i8 @umax_of_add_nuw_nsw(i8 %a, i8 %b, i8 %c) { 84; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw( 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 nsw i8 [[TMP1]], [[A]] 88; CHECK-NEXT: ret i8 [[MAX]] 89; 90 %add1 = add nuw nsw i8 %b, %a 91 %add2 = add nuw nsw i8 %c, %a 92 %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2) 93 ret i8 %max 94} 95 96define i8 @umax_of_add_nuw_nsw_comm(i8 %a, i8 %b, i8 %c) { 97; CHECK-LABEL: define i8 @umax_of_add_nuw_nsw_comm( 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 nsw i8 [[TMP1]], [[A]] 101; CHECK-NEXT: ret i8 [[MAX]] 102; 103 %add1 = add nuw nsw i8 %a, %b 104 %add2 = add nuw nsw i8 %a, %c 105 %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2) 106 ret i8 %max 107} 108 109; negative test 110define i8 @umax_of_add_nsw(i8 %a, i8 %b, i8 %c) { 111; CHECK-LABEL: define i8 @umax_of_add_nsw( 112; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 113; CHECK-NEXT: [[ADD1:%.*]] = add nsw i8 [[B]], [[A]] 114; CHECK-NEXT: [[ADD2:%.*]] = add nsw i8 [[C]], [[A]] 115; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[ADD1]], i8 [[ADD2]]) 116; CHECK-NEXT: ret i8 [[MAX]] 117; 118 %add1 = add nsw i8 %b, %a 119 %add2 = add nsw i8 %c, %a 120 %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2) 121 ret i8 %max 122} 123 124; negative test 125define i8 @umax_of_add(i8 %a, i8 %b, i8 %c) { 126; CHECK-LABEL: define i8 @umax_of_add( 127; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 128; CHECK-NEXT: [[ADD1:%.*]] = add i8 [[B]], [[A]] 129; CHECK-NEXT: [[ADD2:%.*]] = add i8 [[C]], [[A]] 130; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[ADD1]], i8 [[ADD2]]) 131; CHECK-NEXT: ret i8 [[MAX]] 132; 133 %add1 = add i8 %b, %a 134 %add2 = add i8 %c, %a 135 %max = call i8 @llvm.umax.i8(i8 %add1, i8 %add2) 136 ret i8 %max 137} 138 139define i8 @umin_of_add_nuw(i8 %a, i8 %b, i8 %c) { 140; CHECK-LABEL: define i8 @umin_of_add_nuw( 141; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 142; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]]) 143; CHECK-NEXT: [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]] 144; CHECK-NEXT: ret i8 [[MIN]] 145; 146 %add1 = add nuw i8 %b, %a 147 %add2 = add nuw i8 %c, %a 148 %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2) 149 ret i8 %min 150} 151 152define i8 @umin_of_add_nuw_comm(i8 %a, i8 %b, i8 %c) { 153; CHECK-LABEL: define i8 @umin_of_add_nuw_comm( 154; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 155; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]]) 156; CHECK-NEXT: [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]] 157; CHECK-NEXT: ret i8 [[MIN]] 158; 159 %add1 = add nuw i8 %a, %b 160 %add2 = add nuw i8 %a, %c 161 %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2) 162 ret i8 %min 163} 164 165define i8 @umin_of_add_nuw_nsw_lhs(i8 %a, i8 %b, i8 %c) { 166; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_lhs( 167; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 168; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]]) 169; CHECK-NEXT: [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]] 170; CHECK-NEXT: ret i8 [[MIN]] 171; 172 %add1 = add nuw nsw i8 %b, %a 173 %add2 = add nuw i8 %c, %a 174 %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2) 175 ret i8 %min 176} 177 178define i8 @umin_of_add_nuw_nsw_lhs_comm(i8 %a, i8 %b, i8 %c) { 179; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_lhs_comm( 180; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 181; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 [[C]]) 182; CHECK-NEXT: [[MIN:%.*]] = add nuw i8 [[TMP1]], [[A]] 183; CHECK-NEXT: ret i8 [[MIN]] 184; 185 %add1 = add nuw nsw i8 %a, %b 186 %add2 = add nuw i8 %a, %c 187 %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2) 188 ret i8 %min 189} 190 191define i8 @umin_of_add_nuw_nsw_rhs(i8 %a, i8 %b, i8 %c) { 192; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_rhs( 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, %a 199 %add2 = add nuw nsw i8 %c, %a 200 %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2) 201 ret i8 %min 202} 203 204define i8 @umin_of_add_nuw_nsw_rhs_comm(i8 %a, i8 %b, i8 %c) { 205; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_rhs_comm( 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 [[TMP1]], [[A]] 209; CHECK-NEXT: ret i8 [[MIN]] 210; 211 %add1 = add nuw i8 %a, %b 212 %add2 = add nuw nsw i8 %a, %c 213 %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2) 214 ret i8 %min 215} 216 217define i8 @umin_of_add_nuw_nsw(i8 %a, i8 %b, i8 %c) { 218; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw( 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 nsw i8 [[TMP1]], [[A]] 222; CHECK-NEXT: ret i8 [[MIN]] 223; 224 %add1 = add nuw nsw i8 %b, %a 225 %add2 = add nuw nsw i8 %c, %a 226 %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2) 227 ret i8 %min 228} 229 230define i8 @umin_of_add_nuw_nsw_comm(i8 %a, i8 %b, i8 %c) { 231; CHECK-LABEL: define i8 @umin_of_add_nuw_nsw_comm( 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 nsw i8 [[TMP1]], [[A]] 235; CHECK-NEXT: ret i8 [[MIN]] 236; 237 %add1 = add nuw nsw i8 %a, %b 238 %add2 = add nuw nsw i8 %a, %c 239 %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2) 240 ret i8 %min 241} 242 243; negative test 244define i8 @umin_of_add_nsw(i8 %a, i8 %b, i8 %c) { 245; CHECK-LABEL: define i8 @umin_of_add_nsw( 246; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 247; CHECK-NEXT: [[ADD1:%.*]] = add nsw i8 [[B]], [[A]] 248; CHECK-NEXT: [[ADD2:%.*]] = add nsw i8 [[C]], [[A]] 249; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[ADD1]], i8 [[ADD2]]) 250; CHECK-NEXT: ret i8 [[MIN]] 251; 252 %add1 = add nsw i8 %b, %a 253 %add2 = add nsw i8 %c, %a 254 %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2) 255 ret i8 %min 256} 257 258; negative test 259define i8 @umin_of_add(i8 %a, i8 %b, i8 %c) { 260; CHECK-LABEL: define i8 @umin_of_add( 261; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 262; CHECK-NEXT: [[ADD1:%.*]] = add i8 [[B]], [[A]] 263; CHECK-NEXT: [[ADD2:%.*]] = add i8 [[C]], [[A]] 264; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[ADD1]], i8 [[ADD2]]) 265; CHECK-NEXT: ret i8 [[MIN]] 266; 267 %add1 = add i8 %b, %a 268 %add2 = add i8 %c, %a 269 %min = call i8 @llvm.umin.i8(i8 %add1, i8 %add2) 270 ret i8 %min 271} 272 273; negative test 274define i8 @smax_of_add_nuw(i8 %a, i8 %b, i8 %c) { 275; CHECK-LABEL: define i8 @smax_of_add_nuw( 276; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 277; CHECK-NEXT: [[ADD1:%.*]] = add nuw i8 [[B]], [[A]] 278; CHECK-NEXT: [[ADD2:%.*]] = add nuw i8 [[C]], [[A]] 279; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[ADD1]], i8 [[ADD2]]) 280; CHECK-NEXT: ret i8 [[MAX]] 281; 282 %add1 = add nuw i8 %b, %a 283 %add2 = add nuw i8 %c, %a 284 %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2) 285 ret i8 %max 286} 287 288define i8 @smax_of_add_nsw(i8 %a, i8 %b, i8 %c) { 289; CHECK-LABEL: define i8 @smax_of_add_nsw( 290; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 291; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]]) 292; CHECK-NEXT: [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]] 293; CHECK-NEXT: ret i8 [[MAX]] 294; 295 %add1 = add nsw i8 %b, %a 296 %add2 = add nsw i8 %c, %a 297 %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2) 298 ret i8 %max 299} 300 301define i8 @smax_of_add_nsw_comm(i8 %a, i8 %b, i8 %c) { 302; CHECK-LABEL: define i8 @smax_of_add_nsw_comm( 303; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 304; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]]) 305; CHECK-NEXT: [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]] 306; CHECK-NEXT: ret i8 [[MAX]] 307; 308 %add1 = add nsw i8 %a, %b 309 %add2 = add nsw i8 %a, %c 310 %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2) 311 ret i8 %max 312} 313 314define i8 @smax_of_add_nsw_nuw_lhs(i8 %a, i8 %b, i8 %c) { 315; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_lhs( 316; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 317; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]]) 318; CHECK-NEXT: [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]] 319; CHECK-NEXT: ret i8 [[MAX]] 320; 321 %add1 = add nsw nuw i8 %b, %a 322 %add2 = add nsw i8 %c, %a 323 %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2) 324 ret i8 %max 325} 326 327define i8 @smax_of_add_nsw_nuw_lhs_comm(i8 %a, i8 %b, i8 %c) { 328; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_lhs_comm( 329; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 330; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]]) 331; CHECK-NEXT: [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]] 332; CHECK-NEXT: ret i8 [[MAX]] 333; 334 %add1 = add nsw nuw i8 %a, %b 335 %add2 = add nsw i8 %a, %c 336 %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2) 337 ret i8 %max 338} 339 340define i8 @smax_of_add_nsw_nuw_rhs(i8 %a, i8 %b, i8 %c) { 341; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_rhs( 342; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 343; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]]) 344; CHECK-NEXT: [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]] 345; CHECK-NEXT: ret i8 [[MAX]] 346; 347 %add1 = add nsw i8 %b, %a 348 %add2 = add nsw nuw i8 %c, %a 349 %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2) 350 ret i8 %max 351} 352 353define i8 @smax_of_add_nsw_nuw_rhs_comm(i8 %a, i8 %b, i8 %c) { 354; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_rhs_comm( 355; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 356; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]]) 357; CHECK-NEXT: [[MAX:%.*]] = add nsw i8 [[TMP1]], [[A]] 358; CHECK-NEXT: ret i8 [[MAX]] 359; 360 %add1 = add nsw i8 %a, %b 361 %add2 = add nsw nuw i8 %a, %c 362 %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2) 363 ret i8 %max 364} 365 366define i8 @smax_of_add_nsw_nuw(i8 %a, i8 %b, i8 %c) { 367; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw( 368; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 369; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]]) 370; CHECK-NEXT: [[MAX:%.*]] = add nuw nsw i8 [[TMP1]], [[A]] 371; CHECK-NEXT: ret i8 [[MAX]] 372; 373 %add1 = add nsw nuw i8 %b, %a 374 %add2 = add nsw nuw i8 %c, %a 375 %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2) 376 ret i8 %max 377} 378 379define i8 @smax_of_add_nsw_nuw_comm(i8 %a, i8 %b, i8 %c) { 380; CHECK-LABEL: define i8 @smax_of_add_nsw_nuw_comm( 381; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 382; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[B]], i8 [[C]]) 383; CHECK-NEXT: [[MAX:%.*]] = add nuw nsw i8 [[TMP1]], [[A]] 384; CHECK-NEXT: ret i8 [[MAX]] 385; 386 %add1 = add nsw nuw i8 %a, %b 387 %add2 = add nsw nuw i8 %a, %c 388 %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2) 389 ret i8 %max 390} 391 392; negative test 393define i8 @smax_of_add(i8 %a, i8 %b, i8 %c) { 394; CHECK-LABEL: define i8 @smax_of_add( 395; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 396; CHECK-NEXT: [[ADD1:%.*]] = add i8 [[B]], [[A]] 397; CHECK-NEXT: [[ADD2:%.*]] = add i8 [[C]], [[A]] 398; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[ADD1]], i8 [[ADD2]]) 399; CHECK-NEXT: ret i8 [[MAX]] 400; 401 %add1 = add i8 %b, %a 402 %add2 = add i8 %c, %a 403 %max = call i8 @llvm.smax.i8(i8 %add1, i8 %add2) 404 ret i8 %max 405} 406 407; negative test 408define i8 @smin_of_add_nuw(i8 %a, i8 %b, i8 %c) { 409; CHECK-LABEL: define i8 @smin_of_add_nuw( 410; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 411; CHECK-NEXT: [[ADD1:%.*]] = add nuw i8 [[B]], [[A]] 412; CHECK-NEXT: [[ADD2:%.*]] = add nuw i8 [[C]], [[A]] 413; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[ADD1]], i8 [[ADD2]]) 414; CHECK-NEXT: ret i8 [[MIN]] 415; 416 %add1 = add nuw i8 %b, %a 417 %add2 = add nuw i8 %c, %a 418 %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2) 419 ret i8 %min 420} 421 422define i8 @smin_of_add_nsw(i8 %a, i8 %b, i8 %c) { 423; CHECK-LABEL: define i8 @smin_of_add_nsw( 424; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 425; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]]) 426; CHECK-NEXT: [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]] 427; CHECK-NEXT: ret i8 [[MIN]] 428; 429 %add1 = add nsw i8 %b, %a 430 %add2 = add nsw i8 %c, %a 431 %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2) 432 ret i8 %min 433} 434 435define i8 @smin_of_add_nsw_comm(i8 %a, i8 %b, i8 %c) { 436; CHECK-LABEL: define i8 @smin_of_add_nsw_comm( 437; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 438; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]]) 439; CHECK-NEXT: [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]] 440; CHECK-NEXT: ret i8 [[MIN]] 441; 442 %add1 = add nsw i8 %a, %b 443 %add2 = add nsw i8 %a, %c 444 %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2) 445 ret i8 %min 446} 447 448define i8 @smin_of_add_nsw_nuw_lhs(i8 %a, i8 %b, i8 %c) { 449; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_lhs( 450; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 451; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]]) 452; CHECK-NEXT: [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]] 453; CHECK-NEXT: ret i8 [[MIN]] 454; 455 %add1 = add nsw nuw i8 %b, %a 456 %add2 = add nsw i8 %c, %a 457 %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2) 458 ret i8 %min 459} 460 461define i8 @smin_of_add_nsw_nuw_lhs_comm(i8 %a, i8 %b, i8 %c) { 462; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_lhs_comm( 463; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 464; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]]) 465; CHECK-NEXT: [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]] 466; CHECK-NEXT: ret i8 [[MIN]] 467; 468 %add1 = add nsw nuw i8 %a, %b 469 %add2 = add nsw i8 %a, %c 470 %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2) 471 ret i8 %min 472} 473 474define i8 @smin_of_add_nsw_nuw_rhs(i8 %a, i8 %b, i8 %c) { 475; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_rhs( 476; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 477; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]]) 478; CHECK-NEXT: [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]] 479; CHECK-NEXT: ret i8 [[MIN]] 480; 481 %add1 = add nsw i8 %b, %a 482 %add2 = add nsw nuw i8 %c, %a 483 %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2) 484 ret i8 %min 485} 486 487define i8 @smin_of_add_nsw_nuw_rhs_comm(i8 %a, i8 %b, i8 %c) { 488; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_rhs_comm( 489; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 490; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]]) 491; CHECK-NEXT: [[MIN:%.*]] = add nsw i8 [[TMP1]], [[A]] 492; CHECK-NEXT: ret i8 [[MIN]] 493; 494 %add1 = add nsw i8 %a, %b 495 %add2 = add nsw nuw i8 %a, %c 496 %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2) 497 ret i8 %min 498} 499 500define i8 @smin_of_add_nsw_nuw(i8 %a, i8 %b, i8 %c) { 501; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw( 502; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 503; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]]) 504; CHECK-NEXT: [[MIN:%.*]] = add nuw nsw i8 [[TMP1]], [[A]] 505; CHECK-NEXT: ret i8 [[MIN]] 506; 507 %add1 = add nsw nuw i8 %b, %a 508 %add2 = add nsw nuw i8 %c, %a 509 %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2) 510 ret i8 %min 511} 512 513define i8 @smin_of_add_nsw_nuw_comm(i8 %a, i8 %b, i8 %c) { 514; CHECK-LABEL: define i8 @smin_of_add_nsw_nuw_comm( 515; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 516; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[B]], i8 [[C]]) 517; CHECK-NEXT: [[MIN:%.*]] = add nuw nsw i8 [[TMP1]], [[A]] 518; CHECK-NEXT: ret i8 [[MIN]] 519; 520 %add1 = add nsw nuw i8 %a, %b 521 %add2 = add nsw nuw i8 %a, %c 522 %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2) 523 ret i8 %min 524} 525 526; negative test 527define i8 @smin_of_add(i8 %a, i8 %b, i8 %c) { 528; CHECK-LABEL: define i8 @smin_of_add( 529; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]], i8 [[C:%.*]]) { 530; CHECK-NEXT: [[ADD1:%.*]] = add i8 [[B]], [[A]] 531; CHECK-NEXT: [[ADD2:%.*]] = add i8 [[C]], [[A]] 532; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[ADD1]], i8 [[ADD2]]) 533; CHECK-NEXT: ret i8 [[MIN]] 534; 535 %add1 = add i8 %b, %a 536 %add2 = add i8 %c, %a 537 %min = call i8 @llvm.smin.i8(i8 %add1, i8 %add2) 538 ret i8 %min 539} 540