1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3 4; If we have an smin feeding a signed or equality icmp that shares an 5; operand with the smin, the compare should always be folded. 6; Test all 6 foldable predicates (eq,ne,sge,sgt,sle,slt) * 4 commutation 7; possibilities for each predicate. Note that folds to true/false or 8; folds to an existing instruction may be handled by InstSimplify. 9 10; smin(X, Y) == X --> X <= Y 11 12define i1 @eq_smin1(i32 %x, i32 %y) { 13; CHECK-LABEL: @eq_smin1( 14; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[X:%.*]], [[Y:%.*]] 15; CHECK-NEXT: ret i1 [[CMP2]] 16; 17 %cmp1 = icmp slt i32 %x, %y 18 %sel = select i1 %cmp1, i32 %x, i32 %y 19 %cmp2 = icmp eq i32 %sel, %x 20 ret i1 %cmp2 21} 22 23; Commute min operands. 24 25define i1 @eq_smin2(i32 %x, i32 %y) { 26; CHECK-LABEL: @eq_smin2( 27; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[X:%.*]], [[Y:%.*]] 28; CHECK-NEXT: ret i1 [[CMP2]] 29; 30 %cmp1 = icmp slt i32 %y, %x 31 %sel = select i1 %cmp1, i32 %y, i32 %x 32 %cmp2 = icmp eq i32 %sel, %x 33 ret i1 %cmp2 34} 35 36; Disguise the icmp predicate by commuting the min op to the RHS. 37 38define i1 @eq_smin3(i32 %a, i32 %y) { 39; CHECK-LABEL: @eq_smin3( 40; CHECK-NEXT: [[X:%.*]] = add i32 [[A:%.*]], 3 41; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[X]], [[Y:%.*]] 42; CHECK-NEXT: ret i1 [[CMP2]] 43; 44 %x = add i32 %a, 3 ; thwart complexity-based canonicalization 45 %cmp1 = icmp slt i32 %x, %y 46 %sel = select i1 %cmp1, i32 %x, i32 %y 47 %cmp2 = icmp eq i32 %x, %sel 48 ret i1 %cmp2 49} 50 51; Commute min operands. 52 53define i1 @eq_smin4(i32 %a, i32 %y) { 54; CHECK-LABEL: @eq_smin4( 55; CHECK-NEXT: [[X:%.*]] = add i32 [[A:%.*]], 3 56; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[X]], [[Y:%.*]] 57; CHECK-NEXT: ret i1 [[CMP2]] 58; 59 %x = add i32 %a, 3 ; thwart complexity-based canonicalization 60 %cmp1 = icmp slt i32 %y, %x 61 %sel = select i1 %cmp1, i32 %y, i32 %x 62 %cmp2 = icmp eq i32 %x, %sel 63 ret i1 %cmp2 64} 65 66; smin(X, Y) >= X --> Y >= X 67 68define i1 @sge_smin1(i32 %x, i32 %y) { 69; CHECK-LABEL: @sge_smin1( 70; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i32 [[Y:%.*]], [[X:%.*]] 71; CHECK-NEXT: ret i1 [[CMP2]] 72; 73 %cmp1 = icmp slt i32 %x, %y 74 %sel = select i1 %cmp1, i32 %x, i32 %y 75 %cmp2 = icmp sge i32 %sel, %x 76 ret i1 %cmp2 77} 78 79; Commute min operands. 80 81define i1 @sge_smin2(i32 %x, i32 %y) { 82; CHECK-LABEL: @sge_smin2( 83; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i32 [[Y:%.*]], [[X:%.*]] 84; CHECK-NEXT: ret i1 [[CMP2]] 85; 86 %cmp1 = icmp slt i32 %y, %x 87 %sel = select i1 %cmp1, i32 %y, i32 %x 88 %cmp2 = icmp sge i32 %sel, %x 89 ret i1 %cmp2 90} 91 92; Disguise the icmp predicate by commuting the min op to the RHS. 93 94define i1 @sge_smin3(i32 %a, i32 %y) { 95; CHECK-LABEL: @sge_smin3( 96; CHECK-NEXT: [[X:%.*]] = add i32 [[A:%.*]], 3 97; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i32 [[Y:%.*]], [[X]] 98; CHECK-NEXT: ret i1 [[CMP2]] 99; 100 %x = add i32 %a, 3 ; thwart complexity-based canonicalization 101 %cmp1 = icmp slt i32 %x, %y 102 %sel = select i1 %cmp1, i32 %x, i32 %y 103 %cmp2 = icmp sle i32 %x, %sel 104 ret i1 %cmp2 105} 106 107; Commute min operands. 108 109define i1 @sge_smin4(i32 %a, i32 %y) { 110; CHECK-LABEL: @sge_smin4( 111; CHECK-NEXT: [[X:%.*]] = add i32 [[A:%.*]], 3 112; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i32 [[Y:%.*]], [[X]] 113; CHECK-NEXT: ret i1 [[CMP2]] 114; 115 %x = add i32 %a, 3 ; thwart complexity-based canonicalization 116 %cmp1 = icmp slt i32 %y, %x 117 %sel = select i1 %cmp1, i32 %y, i32 %x 118 %cmp2 = icmp sle i32 %x, %sel 119 ret i1 %cmp2 120} 121 122; smin(X, Y) != X --> X > Y 123 124define i1 @ne_smin1(i32 %x, i32 %y) { 125; CHECK-LABEL: @ne_smin1( 126; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]] 127; CHECK-NEXT: ret i1 [[CMP2]] 128; 129 %cmp1 = icmp slt i32 %x, %y 130 %sel = select i1 %cmp1, i32 %x, i32 %y 131 %cmp2 = icmp ne i32 %sel, %x 132 ret i1 %cmp2 133} 134 135; Commute min operands. 136 137define i1 @ne_smin2(i32 %x, i32 %y) { 138; CHECK-LABEL: @ne_smin2( 139; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]] 140; CHECK-NEXT: ret i1 [[CMP2]] 141; 142 %cmp1 = icmp slt i32 %y, %x 143 %sel = select i1 %cmp1, i32 %y, i32 %x 144 %cmp2 = icmp ne i32 %sel, %x 145 ret i1 %cmp2 146} 147 148; Disguise the icmp predicate by commuting the min op to the RHS. 149 150define i1 @ne_smin3(i32 %a, i32 %y) { 151; CHECK-LABEL: @ne_smin3( 152; CHECK-NEXT: [[X:%.*]] = add i32 [[A:%.*]], 3 153; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[X]], [[Y:%.*]] 154; CHECK-NEXT: ret i1 [[CMP2]] 155; 156 %x = add i32 %a, 3 ; thwart complexity-based canonicalization 157 %cmp1 = icmp slt i32 %x, %y 158 %sel = select i1 %cmp1, i32 %x, i32 %y 159 %cmp2 = icmp ne i32 %x, %sel 160 ret i1 %cmp2 161} 162 163; Commute min operands. 164 165define i1 @ne_smin4(i32 %a, i32 %y) { 166; CHECK-LABEL: @ne_smin4( 167; CHECK-NEXT: [[X:%.*]] = add i32 [[A:%.*]], 3 168; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[X]], [[Y:%.*]] 169; CHECK-NEXT: ret i1 [[CMP2]] 170; 171 %x = add i32 %a, 3 ; thwart complexity-based canonicalization 172 %cmp1 = icmp slt i32 %y, %x 173 %sel = select i1 %cmp1, i32 %y, i32 %x 174 %cmp2 = icmp ne i32 %x, %sel 175 ret i1 %cmp2 176} 177 178; smin(X, Y) < X --> Y < X 179 180define i1 @slt_smin1(i32 %x, i32 %y) { 181; CHECK-LABEL: @slt_smin1( 182; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X:%.*]] 183; CHECK-NEXT: ret i1 [[CMP2]] 184; 185 %cmp1 = icmp slt i32 %x, %y 186 %sel = select i1 %cmp1, i32 %x, i32 %y 187 %cmp2 = icmp slt i32 %sel, %x 188 ret i1 %cmp2 189} 190 191; Commute min operands. 192 193define i1 @slt_smin2(i32 %x, i32 %y) { 194; CHECK-LABEL: @slt_smin2( 195; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X:%.*]] 196; CHECK-NEXT: ret i1 [[CMP2]] 197; 198 %cmp1 = icmp slt i32 %y, %x 199 %sel = select i1 %cmp1, i32 %y, i32 %x 200 %cmp2 = icmp slt i32 %sel, %x 201 ret i1 %cmp2 202} 203 204; Disguise the icmp predicate by commuting the min op to the RHS. 205 206define i1 @slt_smin3(i32 %a, i32 %y) { 207; CHECK-LABEL: @slt_smin3( 208; CHECK-NEXT: [[X:%.*]] = add i32 [[A:%.*]], 3 209; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X]] 210; CHECK-NEXT: ret i1 [[CMP2]] 211; 212 %x = add i32 %a, 3 ; thwart complexity-based canonicalization 213 %cmp1 = icmp slt i32 %x, %y 214 %sel = select i1 %cmp1, i32 %x, i32 %y 215 %cmp2 = icmp sgt i32 %x, %sel 216 ret i1 %cmp2 217} 218 219; Commute min operands. 220 221define i1 @slt_smin4(i32 %a, i32 %y) { 222; CHECK-LABEL: @slt_smin4( 223; CHECK-NEXT: [[X:%.*]] = add i32 [[A:%.*]], 3 224; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X]] 225; CHECK-NEXT: ret i1 [[CMP2]] 226; 227 %x = add i32 %a, 3 ; thwart complexity-based canonicalization 228 %cmp1 = icmp slt i32 %y, %x 229 %sel = select i1 %cmp1, i32 %y, i32 %x 230 %cmp2 = icmp sgt i32 %x, %sel 231 ret i1 %cmp2 232} 233 234; smin(X, Y) <= X --> true 235 236define i1 @sle_smin1(i32 %x, i32 %y) { 237; CHECK-LABEL: @sle_smin1( 238; CHECK-NEXT: ret i1 true 239; 240 %cmp1 = icmp slt i32 %x, %y 241 %sel = select i1 %cmp1, i32 %x, i32 %y 242 %cmp2 = icmp sle i32 %sel, %x 243 ret i1 %cmp2 244} 245 246; Commute min operands. 247 248define i1 @sle_smin2(i32 %x, i32 %y) { 249; CHECK-LABEL: @sle_smin2( 250; CHECK-NEXT: ret i1 true 251; 252 %cmp1 = icmp slt i32 %y, %x 253 %sel = select i1 %cmp1, i32 %y, i32 %x 254 %cmp2 = icmp sle i32 %sel, %x 255 ret i1 %cmp2 256} 257 258; Disguise the icmp predicate by commuting the min op to the RHS. 259 260define i1 @sle_smin3(i32 %a, i32 %y) { 261; CHECK-LABEL: @sle_smin3( 262; CHECK-NEXT: ret i1 true 263; 264 %x = add i32 %a, 3 ; thwart complexity-based canonicalization 265 %cmp1 = icmp slt i32 %x, %y 266 %sel = select i1 %cmp1, i32 %x, i32 %y 267 %cmp2 = icmp sge i32 %x, %sel 268 ret i1 %cmp2 269} 270 271; Commute min operands. 272 273define i1 @sle_smin4(i32 %a, i32 %y) { 274; CHECK-LABEL: @sle_smin4( 275; CHECK-NEXT: ret i1 true 276; 277 %x = add i32 %a, 3 ; thwart complexity-based canonicalization 278 %cmp1 = icmp slt i32 %y, %x 279 %sel = select i1 %cmp1, i32 %y, i32 %x 280 %cmp2 = icmp sge i32 %x, %sel 281 ret i1 %cmp2 282} 283 284; smin(X, Y) > X --> false 285 286define i1 @sgt_smin1(i32 %x, i32 %y) { 287; CHECK-LABEL: @sgt_smin1( 288; CHECK-NEXT: ret i1 false 289; 290 %cmp1 = icmp slt i32 %x, %y 291 %sel = select i1 %cmp1, i32 %x, i32 %y 292 %cmp2 = icmp sgt i32 %sel, %x 293 ret i1 %cmp2 294} 295 296; Commute min operands. 297 298define i1 @sgt_smin2(i32 %x, i32 %y) { 299; CHECK-LABEL: @sgt_smin2( 300; CHECK-NEXT: ret i1 false 301; 302 %cmp1 = icmp slt i32 %y, %x 303 %sel = select i1 %cmp1, i32 %y, i32 %x 304 %cmp2 = icmp sgt i32 %sel, %x 305 ret i1 %cmp2 306} 307 308; Disguise the icmp predicate by commuting the min op to the RHS. 309 310define i1 @sgt_smin3(i32 %a, i32 %y) { 311; CHECK-LABEL: @sgt_smin3( 312; CHECK-NEXT: ret i1 false 313; 314 %x = add i32 %a, 3 ; thwart complexity-based canonicalization 315 %cmp1 = icmp slt i32 %x, %y 316 %sel = select i1 %cmp1, i32 %x, i32 %y 317 %cmp2 = icmp slt i32 %x, %sel 318 ret i1 %cmp2 319} 320 321; Commute min operands. 322 323define i1 @sgt_smin4(i32 %a, i32 %y) { 324; CHECK-LABEL: @sgt_smin4( 325; CHECK-NEXT: ret i1 false 326; 327 %x = add i32 %a, 3 ; thwart complexity-based canonicalization 328 %cmp1 = icmp slt i32 %y, %x 329 %sel = select i1 %cmp1, i32 %y, i32 %x 330 %cmp2 = icmp slt i32 %x, %sel 331 ret i1 %cmp2 332} 333 334declare void @use(i1 %c) 335 336define void @eq_smin_contextual(i32 %x, i32 %y, i32 %z) { 337; CHECK-LABEL: @eq_smin_contextual( 338; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]] 339; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 340; CHECK: if: 341; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]]) 342; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]] 343; CHECK-NEXT: call void @use(i1 [[CMP1]]) 344; CHECK-NEXT: call void @use(i1 true) 345; CHECK-NEXT: call void @use(i1 false) 346; CHECK-NEXT: [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]] 347; CHECK-NEXT: call void @use(i1 [[CMP4]]) 348; CHECK-NEXT: [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]] 349; CHECK-NEXT: call void @use(i1 [[CMP5]]) 350; CHECK-NEXT: [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]] 351; CHECK-NEXT: call void @use(i1 [[CMP6]]) 352; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]] 353; CHECK-NEXT: call void @use(i1 [[CMP7]]) 354; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]] 355; CHECK-NEXT: call void @use(i1 [[CMP8]]) 356; CHECK-NEXT: [[CMP9:%.*]] = icmp sle i32 [[X]], [[Y]] 357; CHECK-NEXT: call void @use(i1 [[CMP9]]) 358; CHECK-NEXT: [[CMP10:%.*]] = icmp sgt i32 [[X]], [[Y]] 359; CHECK-NEXT: call void @use(i1 [[CMP10]]) 360; CHECK-NEXT: ret void 361; CHECK: end: 362; CHECK-NEXT: ret void 363; 364 %cmp = icmp eq i32 %x, %z 365 br i1 %cmp, label %if, label %end 366if: 367 %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y) 368 %cmp1 = icmp slt i32 %cond, %z 369 call void @use(i1 %cmp1) 370 %cmp2 = icmp sle i32 %cond, %z 371 call void @use(i1 %cmp2) 372 %cmp3 = icmp sgt i32 %cond, %z 373 call void @use(i1 %cmp3) 374 %cmp4 = icmp sge i32 %cond, %z 375 call void @use(i1 %cmp4) 376 %cmp5 = icmp ult i32 %cond, %z 377 call void @use(i1 %cmp5) 378 %cmp6 = icmp ule i32 %cond, %z 379 call void @use(i1 %cmp6) 380 %cmp7 = icmp ugt i32 %cond, %z 381 call void @use(i1 %cmp7) 382 %cmp8 = icmp uge i32 %cond, %z 383 call void @use(i1 %cmp8) 384 %cmp9 = icmp eq i32 %cond, %z 385 call void @use(i1 %cmp9) 386 %cmp10 = icmp ne i32 %cond, %z 387 call void @use(i1 %cmp10) 388 ret void 389end: 390 ret void 391} 392 393define void @eq_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) { 394; CHECK-LABEL: @eq_smin_contextual_commuted( 395; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]] 396; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 397; CHECK: if: 398; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]]) 399; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]] 400; CHECK-NEXT: call void @use(i1 [[CMP1]]) 401; CHECK-NEXT: call void @use(i1 true) 402; CHECK-NEXT: call void @use(i1 false) 403; CHECK-NEXT: [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]] 404; CHECK-NEXT: call void @use(i1 [[CMP4]]) 405; CHECK-NEXT: [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]] 406; CHECK-NEXT: call void @use(i1 [[CMP5]]) 407; CHECK-NEXT: [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]] 408; CHECK-NEXT: call void @use(i1 [[CMP6]]) 409; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]] 410; CHECK-NEXT: call void @use(i1 [[CMP7]]) 411; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]] 412; CHECK-NEXT: call void @use(i1 [[CMP8]]) 413; CHECK-NEXT: [[CMP9:%.*]] = icmp sle i32 [[X]], [[Y]] 414; CHECK-NEXT: call void @use(i1 [[CMP9]]) 415; CHECK-NEXT: [[CMP10:%.*]] = icmp sgt i32 [[X]], [[Y]] 416; CHECK-NEXT: call void @use(i1 [[CMP10]]) 417; CHECK-NEXT: ret void 418; CHECK: end: 419; CHECK-NEXT: ret void 420; 421 %cmp = icmp eq i32 %x, %z 422 br i1 %cmp, label %if, label %end 423if: 424 %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x) 425 %cmp1 = icmp slt i32 %cond, %z 426 call void @use(i1 %cmp1) 427 %cmp2 = icmp sle i32 %cond, %z 428 call void @use(i1 %cmp2) 429 %cmp3 = icmp sgt i32 %cond, %z 430 call void @use(i1 %cmp3) 431 %cmp4 = icmp sge i32 %cond, %z 432 call void @use(i1 %cmp4) 433 %cmp5 = icmp ult i32 %cond, %z 434 call void @use(i1 %cmp5) 435 %cmp6 = icmp ule i32 %cond, %z 436 call void @use(i1 %cmp6) 437 %cmp7 = icmp ugt i32 %cond, %z 438 call void @use(i1 %cmp7) 439 %cmp8 = icmp uge i32 %cond, %z 440 call void @use(i1 %cmp8) 441 %cmp9 = icmp eq i32 %cond, %z 442 call void @use(i1 %cmp9) 443 %cmp10 = icmp ne i32 %cond, %z 444 call void @use(i1 %cmp10) 445 ret void 446end: 447 ret void 448} 449 450define void @slt_smin_contextual(i32 %x, i32 %y, i32 %z) { 451; CHECK-LABEL: @slt_smin_contextual( 452; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], [[Z:%.*]] 453; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 454; CHECK: if: 455; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]]) 456; CHECK-NEXT: call void @use(i1 true) 457; CHECK-NEXT: call void @use(i1 true) 458; CHECK-NEXT: call void @use(i1 false) 459; CHECK-NEXT: call void @use(i1 false) 460; CHECK-NEXT: [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]] 461; CHECK-NEXT: call void @use(i1 [[CMP5]]) 462; CHECK-NEXT: [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]] 463; CHECK-NEXT: call void @use(i1 [[CMP6]]) 464; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]] 465; CHECK-NEXT: call void @use(i1 [[CMP7]]) 466; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]] 467; CHECK-NEXT: call void @use(i1 [[CMP8]]) 468; CHECK-NEXT: call void @use(i1 false) 469; CHECK-NEXT: call void @use(i1 true) 470; CHECK-NEXT: ret void 471; CHECK: end: 472; CHECK-NEXT: ret void 473; 474 %cmp = icmp slt i32 %x, %z 475 br i1 %cmp, label %if, label %end 476if: 477 %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y) 478 %cmp1 = icmp slt i32 %cond, %z 479 call void @use(i1 %cmp1) 480 %cmp2 = icmp sle i32 %cond, %z 481 call void @use(i1 %cmp2) 482 %cmp3 = icmp sgt i32 %cond, %z 483 call void @use(i1 %cmp3) 484 %cmp4 = icmp sge i32 %cond, %z 485 call void @use(i1 %cmp4) 486 %cmp5 = icmp ult i32 %cond, %z 487 call void @use(i1 %cmp5) 488 %cmp6 = icmp ule i32 %cond, %z 489 call void @use(i1 %cmp6) 490 %cmp7 = icmp ugt i32 %cond, %z 491 call void @use(i1 %cmp7) 492 %cmp8 = icmp uge i32 %cond, %z 493 call void @use(i1 %cmp8) 494 %cmp9 = icmp eq i32 %cond, %z 495 call void @use(i1 %cmp9) 496 %cmp10 = icmp ne i32 %cond, %z 497 call void @use(i1 %cmp10) 498 ret void 499end: 500 ret void 501} 502 503define void @slt_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) { 504; CHECK-LABEL: @slt_smin_contextual_commuted( 505; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], [[Z:%.*]] 506; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 507; CHECK: if: 508; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]]) 509; CHECK-NEXT: call void @use(i1 true) 510; CHECK-NEXT: call void @use(i1 true) 511; CHECK-NEXT: call void @use(i1 false) 512; CHECK-NEXT: call void @use(i1 false) 513; CHECK-NEXT: [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]] 514; CHECK-NEXT: call void @use(i1 [[CMP5]]) 515; CHECK-NEXT: [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]] 516; CHECK-NEXT: call void @use(i1 [[CMP6]]) 517; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]] 518; CHECK-NEXT: call void @use(i1 [[CMP7]]) 519; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]] 520; CHECK-NEXT: call void @use(i1 [[CMP8]]) 521; CHECK-NEXT: call void @use(i1 false) 522; CHECK-NEXT: call void @use(i1 true) 523; CHECK-NEXT: ret void 524; CHECK: end: 525; CHECK-NEXT: ret void 526; 527 %cmp = icmp slt i32 %x, %z 528 br i1 %cmp, label %if, label %end 529if: 530 %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x) 531 %cmp1 = icmp slt i32 %cond, %z 532 call void @use(i1 %cmp1) 533 %cmp2 = icmp sle i32 %cond, %z 534 call void @use(i1 %cmp2) 535 %cmp3 = icmp sgt i32 %cond, %z 536 call void @use(i1 %cmp3) 537 %cmp4 = icmp sge i32 %cond, %z 538 call void @use(i1 %cmp4) 539 %cmp5 = icmp ult i32 %cond, %z 540 call void @use(i1 %cmp5) 541 %cmp6 = icmp ule i32 %cond, %z 542 call void @use(i1 %cmp6) 543 %cmp7 = icmp ugt i32 %cond, %z 544 call void @use(i1 %cmp7) 545 %cmp8 = icmp uge i32 %cond, %z 546 call void @use(i1 %cmp8) 547 %cmp9 = icmp eq i32 %cond, %z 548 call void @use(i1 %cmp9) 549 %cmp10 = icmp ne i32 %cond, %z 550 call void @use(i1 %cmp10) 551 ret void 552end: 553 ret void 554} 555 556define void @sle_smin_contextual(i32 %x, i32 %y, i32 %z) { 557; CHECK-LABEL: @sle_smin_contextual( 558; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp sgt i32 [[X:%.*]], [[Z:%.*]] 559; CHECK-NEXT: br i1 [[CMP_NOT]], label [[END:%.*]], label [[IF:%.*]] 560; CHECK: if: 561; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]]) 562; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[COND]], [[Z]] 563; CHECK-NEXT: call void @use(i1 [[CMP1]]) 564; CHECK-NEXT: call void @use(i1 true) 565; CHECK-NEXT: call void @use(i1 false) 566; CHECK-NEXT: [[CMP4:%.*]] = icmp sge i32 [[COND]], [[Z]] 567; CHECK-NEXT: call void @use(i1 [[CMP4]]) 568; CHECK-NEXT: [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]] 569; CHECK-NEXT: call void @use(i1 [[CMP5]]) 570; CHECK-NEXT: [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]] 571; CHECK-NEXT: call void @use(i1 [[CMP6]]) 572; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]] 573; CHECK-NEXT: call void @use(i1 [[CMP7]]) 574; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]] 575; CHECK-NEXT: call void @use(i1 [[CMP8]]) 576; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]] 577; CHECK-NEXT: call void @use(i1 [[CMP9]]) 578; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]] 579; CHECK-NEXT: call void @use(i1 [[CMP10]]) 580; CHECK-NEXT: ret void 581; CHECK: end: 582; CHECK-NEXT: ret void 583; 584 %cmp = icmp sle i32 %x, %z 585 br i1 %cmp, label %if, label %end 586if: 587 %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y) 588 %cmp1 = icmp slt i32 %cond, %z 589 call void @use(i1 %cmp1) 590 %cmp2 = icmp sle i32 %cond, %z 591 call void @use(i1 %cmp2) 592 %cmp3 = icmp sgt i32 %cond, %z 593 call void @use(i1 %cmp3) 594 %cmp4 = icmp sge i32 %cond, %z 595 call void @use(i1 %cmp4) 596 %cmp5 = icmp ult i32 %cond, %z 597 call void @use(i1 %cmp5) 598 %cmp6 = icmp ule i32 %cond, %z 599 call void @use(i1 %cmp6) 600 %cmp7 = icmp ugt i32 %cond, %z 601 call void @use(i1 %cmp7) 602 %cmp8 = icmp uge i32 %cond, %z 603 call void @use(i1 %cmp8) 604 %cmp9 = icmp eq i32 %cond, %z 605 call void @use(i1 %cmp9) 606 %cmp10 = icmp ne i32 %cond, %z 607 call void @use(i1 %cmp10) 608 ret void 609end: 610 ret void 611} 612 613define void @sle_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) { 614; CHECK-LABEL: @sle_smin_contextual_commuted( 615; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp sgt i32 [[X:%.*]], [[Z:%.*]] 616; CHECK-NEXT: br i1 [[CMP_NOT]], label [[END:%.*]], label [[IF:%.*]] 617; CHECK: if: 618; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]]) 619; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[COND]], [[Z]] 620; CHECK-NEXT: call void @use(i1 [[CMP1]]) 621; CHECK-NEXT: call void @use(i1 true) 622; CHECK-NEXT: call void @use(i1 false) 623; CHECK-NEXT: [[CMP4:%.*]] = icmp sge i32 [[COND]], [[Z]] 624; CHECK-NEXT: call void @use(i1 [[CMP4]]) 625; CHECK-NEXT: [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]] 626; CHECK-NEXT: call void @use(i1 [[CMP5]]) 627; CHECK-NEXT: [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]] 628; CHECK-NEXT: call void @use(i1 [[CMP6]]) 629; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]] 630; CHECK-NEXT: call void @use(i1 [[CMP7]]) 631; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]] 632; CHECK-NEXT: call void @use(i1 [[CMP8]]) 633; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]] 634; CHECK-NEXT: call void @use(i1 [[CMP9]]) 635; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]] 636; CHECK-NEXT: call void @use(i1 [[CMP10]]) 637; CHECK-NEXT: ret void 638; CHECK: end: 639; CHECK-NEXT: ret void 640; 641 %cmp = icmp sle i32 %x, %z 642 br i1 %cmp, label %if, label %end 643if: 644 %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x) 645 %cmp1 = icmp slt i32 %cond, %z 646 call void @use(i1 %cmp1) 647 %cmp2 = icmp sle i32 %cond, %z 648 call void @use(i1 %cmp2) 649 %cmp3 = icmp sgt i32 %cond, %z 650 call void @use(i1 %cmp3) 651 %cmp4 = icmp sge i32 %cond, %z 652 call void @use(i1 %cmp4) 653 %cmp5 = icmp ult i32 %cond, %z 654 call void @use(i1 %cmp5) 655 %cmp6 = icmp ule i32 %cond, %z 656 call void @use(i1 %cmp6) 657 %cmp7 = icmp ugt i32 %cond, %z 658 call void @use(i1 %cmp7) 659 %cmp8 = icmp uge i32 %cond, %z 660 call void @use(i1 %cmp8) 661 %cmp9 = icmp eq i32 %cond, %z 662 call void @use(i1 %cmp9) 663 %cmp10 = icmp ne i32 %cond, %z 664 call void @use(i1 %cmp10) 665 ret void 666end: 667 ret void 668} 669 670define void @sgt_smin_contextual(i32 %x, i32 %y, i32 %z) { 671; CHECK-LABEL: @sgt_smin_contextual( 672; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], [[Z:%.*]] 673; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 674; CHECK: if: 675; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]]) 676; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]] 677; CHECK-NEXT: call void @use(i1 [[CMP1]]) 678; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[Y]], [[Z]] 679; CHECK-NEXT: call void @use(i1 [[CMP2]]) 680; CHECK-NEXT: [[CMP3:%.*]] = icmp sgt i32 [[Y]], [[Z]] 681; CHECK-NEXT: call void @use(i1 [[CMP3]]) 682; CHECK-NEXT: [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]] 683; CHECK-NEXT: call void @use(i1 [[CMP4]]) 684; CHECK-NEXT: [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]] 685; CHECK-NEXT: call void @use(i1 [[CMP5]]) 686; CHECK-NEXT: [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]] 687; CHECK-NEXT: call void @use(i1 [[CMP6]]) 688; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]] 689; CHECK-NEXT: call void @use(i1 [[CMP7]]) 690; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]] 691; CHECK-NEXT: call void @use(i1 [[CMP8]]) 692; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]] 693; CHECK-NEXT: call void @use(i1 [[CMP9]]) 694; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]] 695; CHECK-NEXT: call void @use(i1 [[CMP10]]) 696; CHECK-NEXT: ret void 697; CHECK: end: 698; CHECK-NEXT: ret void 699; 700 %cmp = icmp sgt i32 %x, %z 701 br i1 %cmp, label %if, label %end 702if: 703 %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y) 704 %cmp1 = icmp slt i32 %cond, %z 705 call void @use(i1 %cmp1) 706 %cmp2 = icmp sle i32 %cond, %z 707 call void @use(i1 %cmp2) 708 %cmp3 = icmp sgt i32 %cond, %z 709 call void @use(i1 %cmp3) 710 %cmp4 = icmp sge i32 %cond, %z 711 call void @use(i1 %cmp4) 712 %cmp5 = icmp ult i32 %cond, %z 713 call void @use(i1 %cmp5) 714 %cmp6 = icmp ule i32 %cond, %z 715 call void @use(i1 %cmp6) 716 %cmp7 = icmp ugt i32 %cond, %z 717 call void @use(i1 %cmp7) 718 %cmp8 = icmp uge i32 %cond, %z 719 call void @use(i1 %cmp8) 720 %cmp9 = icmp eq i32 %cond, %z 721 call void @use(i1 %cmp9) 722 %cmp10 = icmp ne i32 %cond, %z 723 call void @use(i1 %cmp10) 724 ret void 725end: 726 ret void 727} 728 729define void @sgt_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) { 730; CHECK-LABEL: @sgt_smin_contextual_commuted( 731; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], [[Z:%.*]] 732; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 733; CHECK: if: 734; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]]) 735; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]] 736; CHECK-NEXT: call void @use(i1 [[CMP1]]) 737; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[Y]], [[Z]] 738; CHECK-NEXT: call void @use(i1 [[CMP2]]) 739; CHECK-NEXT: [[CMP3:%.*]] = icmp sgt i32 [[Y]], [[Z]] 740; CHECK-NEXT: call void @use(i1 [[CMP3]]) 741; CHECK-NEXT: [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]] 742; CHECK-NEXT: call void @use(i1 [[CMP4]]) 743; CHECK-NEXT: [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]] 744; CHECK-NEXT: call void @use(i1 [[CMP5]]) 745; CHECK-NEXT: [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]] 746; CHECK-NEXT: call void @use(i1 [[CMP6]]) 747; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]] 748; CHECK-NEXT: call void @use(i1 [[CMP7]]) 749; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]] 750; CHECK-NEXT: call void @use(i1 [[CMP8]]) 751; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]] 752; CHECK-NEXT: call void @use(i1 [[CMP9]]) 753; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]] 754; CHECK-NEXT: call void @use(i1 [[CMP10]]) 755; CHECK-NEXT: ret void 756; CHECK: end: 757; CHECK-NEXT: ret void 758; 759 %cmp = icmp sgt i32 %x, %z 760 br i1 %cmp, label %if, label %end 761if: 762 %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x) 763 %cmp1 = icmp slt i32 %cond, %z 764 call void @use(i1 %cmp1) 765 %cmp2 = icmp sle i32 %cond, %z 766 call void @use(i1 %cmp2) 767 %cmp3 = icmp sgt i32 %cond, %z 768 call void @use(i1 %cmp3) 769 %cmp4 = icmp sge i32 %cond, %z 770 call void @use(i1 %cmp4) 771 %cmp5 = icmp ult i32 %cond, %z 772 call void @use(i1 %cmp5) 773 %cmp6 = icmp ule i32 %cond, %z 774 call void @use(i1 %cmp6) 775 %cmp7 = icmp ugt i32 %cond, %z 776 call void @use(i1 %cmp7) 777 %cmp8 = icmp uge i32 %cond, %z 778 call void @use(i1 %cmp8) 779 %cmp9 = icmp eq i32 %cond, %z 780 call void @use(i1 %cmp9) 781 %cmp10 = icmp ne i32 %cond, %z 782 call void @use(i1 %cmp10) 783 ret void 784end: 785 ret void 786} 787 788define void @sge_smin_contextual(i32 %x, i32 %y, i32 %z) { 789; CHECK-LABEL: @sge_smin_contextual( 790; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp slt i32 [[X:%.*]], [[Z:%.*]] 791; CHECK-NEXT: br i1 [[CMP_NOT]], label [[END:%.*]], label [[IF:%.*]] 792; CHECK: if: 793; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]]) 794; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]] 795; CHECK-NEXT: call void @use(i1 [[CMP1]]) 796; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[COND]], [[Z]] 797; CHECK-NEXT: call void @use(i1 [[CMP2]]) 798; CHECK-NEXT: [[CMP3:%.*]] = icmp sgt i32 [[COND]], [[Z]] 799; CHECK-NEXT: call void @use(i1 [[CMP3]]) 800; CHECK-NEXT: [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]] 801; CHECK-NEXT: call void @use(i1 [[CMP4]]) 802; CHECK-NEXT: [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]] 803; CHECK-NEXT: call void @use(i1 [[CMP5]]) 804; CHECK-NEXT: [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]] 805; CHECK-NEXT: call void @use(i1 [[CMP6]]) 806; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]] 807; CHECK-NEXT: call void @use(i1 [[CMP7]]) 808; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]] 809; CHECK-NEXT: call void @use(i1 [[CMP8]]) 810; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]] 811; CHECK-NEXT: call void @use(i1 [[CMP9]]) 812; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]] 813; CHECK-NEXT: call void @use(i1 [[CMP10]]) 814; CHECK-NEXT: ret void 815; CHECK: end: 816; CHECK-NEXT: ret void 817; 818 %cmp = icmp sge i32 %x, %z 819 br i1 %cmp, label %if, label %end 820if: 821 %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y) 822 %cmp1 = icmp slt i32 %cond, %z 823 call void @use(i1 %cmp1) 824 %cmp2 = icmp sle i32 %cond, %z 825 call void @use(i1 %cmp2) 826 %cmp3 = icmp sgt i32 %cond, %z 827 call void @use(i1 %cmp3) 828 %cmp4 = icmp sge i32 %cond, %z 829 call void @use(i1 %cmp4) 830 %cmp5 = icmp ult i32 %cond, %z 831 call void @use(i1 %cmp5) 832 %cmp6 = icmp ule i32 %cond, %z 833 call void @use(i1 %cmp6) 834 %cmp7 = icmp ugt i32 %cond, %z 835 call void @use(i1 %cmp7) 836 %cmp8 = icmp uge i32 %cond, %z 837 call void @use(i1 %cmp8) 838 %cmp9 = icmp eq i32 %cond, %z 839 call void @use(i1 %cmp9) 840 %cmp10 = icmp ne i32 %cond, %z 841 call void @use(i1 %cmp10) 842 ret void 843end: 844 ret void 845} 846 847define void @sge_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) { 848; CHECK-LABEL: @sge_smin_contextual_commuted( 849; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp slt i32 [[X:%.*]], [[Z:%.*]] 850; CHECK-NEXT: br i1 [[CMP_NOT]], label [[END:%.*]], label [[IF:%.*]] 851; CHECK: if: 852; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]]) 853; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]] 854; CHECK-NEXT: call void @use(i1 [[CMP1]]) 855; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[COND]], [[Z]] 856; CHECK-NEXT: call void @use(i1 [[CMP2]]) 857; CHECK-NEXT: [[CMP3:%.*]] = icmp sgt i32 [[COND]], [[Z]] 858; CHECK-NEXT: call void @use(i1 [[CMP3]]) 859; CHECK-NEXT: [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]] 860; CHECK-NEXT: call void @use(i1 [[CMP4]]) 861; CHECK-NEXT: [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]] 862; CHECK-NEXT: call void @use(i1 [[CMP5]]) 863; CHECK-NEXT: [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]] 864; CHECK-NEXT: call void @use(i1 [[CMP6]]) 865; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]] 866; CHECK-NEXT: call void @use(i1 [[CMP7]]) 867; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]] 868; CHECK-NEXT: call void @use(i1 [[CMP8]]) 869; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]] 870; CHECK-NEXT: call void @use(i1 [[CMP9]]) 871; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]] 872; CHECK-NEXT: call void @use(i1 [[CMP10]]) 873; CHECK-NEXT: ret void 874; CHECK: end: 875; CHECK-NEXT: ret void 876; 877 %cmp = icmp sge i32 %x, %z 878 br i1 %cmp, label %if, label %end 879if: 880 %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x) 881 %cmp1 = icmp slt i32 %cond, %z 882 call void @use(i1 %cmp1) 883 %cmp2 = icmp sle i32 %cond, %z 884 call void @use(i1 %cmp2) 885 %cmp3 = icmp sgt i32 %cond, %z 886 call void @use(i1 %cmp3) 887 %cmp4 = icmp sge i32 %cond, %z 888 call void @use(i1 %cmp4) 889 %cmp5 = icmp ult i32 %cond, %z 890 call void @use(i1 %cmp5) 891 %cmp6 = icmp ule i32 %cond, %z 892 call void @use(i1 %cmp6) 893 %cmp7 = icmp ugt i32 %cond, %z 894 call void @use(i1 %cmp7) 895 %cmp8 = icmp uge i32 %cond, %z 896 call void @use(i1 %cmp8) 897 %cmp9 = icmp eq i32 %cond, %z 898 call void @use(i1 %cmp9) 899 %cmp10 = icmp ne i32 %cond, %z 900 call void @use(i1 %cmp10) 901 ret void 902end: 903 ret void 904} 905 906declare void @use_v2i1(<2 x i1> %c) 907 908; icmp pred smin(X, Y), X 909define void @eq_smin_v2i32(<2 x i32> %x, <2 x i32> %y) { 910; CHECK-LABEL: @eq_smin_v2i32( 911; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]]) 912; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[Y]], [[X]] 913; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP1]]) 914; CHECK-NEXT: call void @use_v2i1(<2 x i1> splat (i1 true)) 915; CHECK-NEXT: call void @use_v2i1(<2 x i1> zeroinitializer) 916; CHECK-NEXT: [[CMP4:%.*]] = icmp sge <2 x i32> [[Y]], [[X]] 917; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP4]]) 918; CHECK-NEXT: [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], [[X]] 919; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP5]]) 920; CHECK-NEXT: [[CMP6:%.*]] = icmp ule <2 x i32> [[COND]], [[X]] 921; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP6]]) 922; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], [[X]] 923; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP7]]) 924; CHECK-NEXT: [[CMP8:%.*]] = icmp uge <2 x i32> [[COND]], [[X]] 925; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP8]]) 926; CHECK-NEXT: [[CMP9:%.*]] = icmp sle <2 x i32> [[X]], [[Y]] 927; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP9]]) 928; CHECK-NEXT: [[CMP10:%.*]] = icmp sgt <2 x i32> [[X]], [[Y]] 929; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP10]]) 930; CHECK-NEXT: ret void 931; 932 %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %x, <2 x i32> %y) 933 %cmp1 = icmp slt <2 x i32> %cond, %x 934 call void @use_v2i1(<2 x i1> %cmp1) 935 %cmp2 = icmp sle <2 x i32> %cond, %x 936 call void @use_v2i1(<2 x i1> %cmp2) 937 %cmp3 = icmp sgt <2 x i32> %cond, %x 938 call void @use_v2i1(<2 x i1> %cmp3) 939 %cmp4 = icmp sge <2 x i32> %cond, %x 940 call void @use_v2i1(<2 x i1> %cmp4) 941 %cmp5 = icmp ult <2 x i32> %cond, %x 942 call void @use_v2i1(<2 x i1> %cmp5) 943 %cmp6 = icmp ule <2 x i32> %cond, %x 944 call void @use_v2i1(<2 x i1> %cmp6) 945 %cmp7 = icmp ugt <2 x i32> %cond, %x 946 call void @use_v2i1(<2 x i1> %cmp7) 947 %cmp8 = icmp uge <2 x i32> %cond, %x 948 call void @use_v2i1(<2 x i1> %cmp8) 949 %cmp9 = icmp eq <2 x i32> %cond, %x 950 call void @use_v2i1(<2 x i1> %cmp9) 951 %cmp10 = icmp ne <2 x i32> %cond, %x 952 call void @use_v2i1(<2 x i1> %cmp10) 953 ret void 954} 955 956; icmp pred smin(C1, Y), C2 where C1 == C2 957define void @eq_smin_v2i32_constant(<2 x i32> %y) { 958; CHECK-LABEL: @eq_smin_v2i32_constant( 959; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> splat (i32 10)) 960; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 10) 961; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP1]]) 962; CHECK-NEXT: call void @use_v2i1(<2 x i1> splat (i1 true)) 963; CHECK-NEXT: call void @use_v2i1(<2 x i1> zeroinitializer) 964; CHECK-NEXT: [[CMP4:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 9) 965; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP4]]) 966; CHECK-NEXT: [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10) 967; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP5]]) 968; CHECK-NEXT: [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11) 969; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP6]]) 970; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10) 971; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP7]]) 972; CHECK-NEXT: [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9) 973; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP8]]) 974; CHECK-NEXT: [[CMP9:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 9) 975; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP9]]) 976; CHECK-NEXT: [[CMP10:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 10) 977; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP10]]) 978; CHECK-NEXT: ret void 979; 980 %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 10, i32 10>, <2 x i32> %y) 981 %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10> 982 call void @use_v2i1(<2 x i1> %cmp1) 983 %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10> 984 call void @use_v2i1(<2 x i1> %cmp2) 985 %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10> 986 call void @use_v2i1(<2 x i1> %cmp3) 987 %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10> 988 call void @use_v2i1(<2 x i1> %cmp4) 989 %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10> 990 call void @use_v2i1(<2 x i1> %cmp5) 991 %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10> 992 call void @use_v2i1(<2 x i1> %cmp6) 993 %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10> 994 call void @use_v2i1(<2 x i1> %cmp7) 995 %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10> 996 call void @use_v2i1(<2 x i1> %cmp8) 997 %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10> 998 call void @use_v2i1(<2 x i1> %cmp9) 999 %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10> 1000 call void @use_v2i1(<2 x i1> %cmp10) 1001 ret void 1002} 1003 1004; icmp pred smin(C1, Y), C2 where C1 < C2 1005define void @slt_smin_v2i32_constant(<2 x i32> %y) { 1006; CHECK-LABEL: @slt_smin_v2i32_constant( 1007; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> splat (i32 5)) 1008; CHECK-NEXT: call void @use_v2i1(<2 x i1> splat (i1 true)) 1009; CHECK-NEXT: call void @use_v2i1(<2 x i1> splat (i1 true)) 1010; CHECK-NEXT: call void @use_v2i1(<2 x i1> zeroinitializer) 1011; CHECK-NEXT: call void @use_v2i1(<2 x i1> zeroinitializer) 1012; CHECK-NEXT: [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10) 1013; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP5]]) 1014; CHECK-NEXT: [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11) 1015; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP6]]) 1016; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10) 1017; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP7]]) 1018; CHECK-NEXT: [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9) 1019; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP8]]) 1020; CHECK-NEXT: call void @use_v2i1(<2 x i1> zeroinitializer) 1021; CHECK-NEXT: call void @use_v2i1(<2 x i1> splat (i1 true)) 1022; CHECK-NEXT: ret void 1023; 1024 %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 5, i32 5>, <2 x i32> %y) 1025 %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10> 1026 call void @use_v2i1(<2 x i1> %cmp1) 1027 %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10> 1028 call void @use_v2i1(<2 x i1> %cmp2) 1029 %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10> 1030 call void @use_v2i1(<2 x i1> %cmp3) 1031 %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10> 1032 call void @use_v2i1(<2 x i1> %cmp4) 1033 %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10> 1034 call void @use_v2i1(<2 x i1> %cmp5) 1035 %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10> 1036 call void @use_v2i1(<2 x i1> %cmp6) 1037 %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10> 1038 call void @use_v2i1(<2 x i1> %cmp7) 1039 %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10> 1040 call void @use_v2i1(<2 x i1> %cmp8) 1041 %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10> 1042 call void @use_v2i1(<2 x i1> %cmp9) 1043 %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10> 1044 call void @use_v2i1(<2 x i1> %cmp10) 1045 ret void 1046} 1047 1048; icmp pred smin(C1, Y), C2 where C1 <= C2 1049define void @sle_smin_v2i32_constant(<2 x i32> %y) { 1050; CHECK-LABEL: @sle_smin_v2i32_constant( 1051; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> <i32 5, i32 10>) 1052; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], splat (i32 10) 1053; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP1]]) 1054; CHECK-NEXT: call void @use_v2i1(<2 x i1> splat (i1 true)) 1055; CHECK-NEXT: call void @use_v2i1(<2 x i1> zeroinitializer) 1056; CHECK-NEXT: [[CMP4:%.*]] = icmp sgt <2 x i32> [[COND]], splat (i32 9) 1057; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP4]]) 1058; CHECK-NEXT: [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10) 1059; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP5]]) 1060; CHECK-NEXT: [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11) 1061; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP6]]) 1062; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10) 1063; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP7]]) 1064; CHECK-NEXT: [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9) 1065; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP8]]) 1066; CHECK-NEXT: [[CMP9:%.*]] = icmp eq <2 x i32> [[COND]], splat (i32 10) 1067; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP9]]) 1068; CHECK-NEXT: [[CMP10:%.*]] = icmp ne <2 x i32> [[COND]], splat (i32 10) 1069; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP10]]) 1070; CHECK-NEXT: ret void 1071; 1072 %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 5, i32 10>, <2 x i32> %y) 1073 %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10> 1074 call void @use_v2i1(<2 x i1> %cmp1) 1075 %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10> 1076 call void @use_v2i1(<2 x i1> %cmp2) 1077 %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10> 1078 call void @use_v2i1(<2 x i1> %cmp3) 1079 %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10> 1080 call void @use_v2i1(<2 x i1> %cmp4) 1081 %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10> 1082 call void @use_v2i1(<2 x i1> %cmp5) 1083 %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10> 1084 call void @use_v2i1(<2 x i1> %cmp6) 1085 %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10> 1086 call void @use_v2i1(<2 x i1> %cmp7) 1087 %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10> 1088 call void @use_v2i1(<2 x i1> %cmp8) 1089 %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10> 1090 call void @use_v2i1(<2 x i1> %cmp9) 1091 %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10> 1092 call void @use_v2i1(<2 x i1> %cmp10) 1093 ret void 1094} 1095 1096; icmp pred smin(C1, Y), C2 where C1 > C2 1097define void @sgt_smin_v2i32_constant(<2 x i32> %y) { 1098; CHECK-LABEL: @sgt_smin_v2i32_constant( 1099; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> splat (i32 15)) 1100; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 10) 1101; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP1]]) 1102; CHECK-NEXT: [[CMP2:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 11) 1103; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP2]]) 1104; CHECK-NEXT: [[CMP3:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 10) 1105; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP3]]) 1106; CHECK-NEXT: [[CMP4:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 9) 1107; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP4]]) 1108; CHECK-NEXT: [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10) 1109; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP5]]) 1110; CHECK-NEXT: [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11) 1111; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP6]]) 1112; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10) 1113; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP7]]) 1114; CHECK-NEXT: [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9) 1115; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP8]]) 1116; CHECK-NEXT: [[CMP9:%.*]] = icmp eq <2 x i32> [[Y]], splat (i32 10) 1117; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP9]]) 1118; CHECK-NEXT: [[CMP10:%.*]] = icmp ne <2 x i32> [[Y]], splat (i32 10) 1119; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP10]]) 1120; CHECK-NEXT: ret void 1121; 1122 %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 15, i32 15>, <2 x i32> %y) 1123 %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10> 1124 call void @use_v2i1(<2 x i1> %cmp1) 1125 %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10> 1126 call void @use_v2i1(<2 x i1> %cmp2) 1127 %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10> 1128 call void @use_v2i1(<2 x i1> %cmp3) 1129 %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10> 1130 call void @use_v2i1(<2 x i1> %cmp4) 1131 %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10> 1132 call void @use_v2i1(<2 x i1> %cmp5) 1133 %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10> 1134 call void @use_v2i1(<2 x i1> %cmp6) 1135 %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10> 1136 call void @use_v2i1(<2 x i1> %cmp7) 1137 %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10> 1138 call void @use_v2i1(<2 x i1> %cmp8) 1139 %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10> 1140 call void @use_v2i1(<2 x i1> %cmp9) 1141 %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10> 1142 call void @use_v2i1(<2 x i1> %cmp10) 1143 ret void 1144} 1145 1146; icmp pred smin(C1, Y), C2 where C1 >= C2 1147define void @sge_smin_v2i32_constant(<2 x i32> %y) { 1148; CHECK-LABEL: @sge_smin_v2i32_constant( 1149; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> <i32 15, i32 10>) 1150; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 10) 1151; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP1]]) 1152; CHECK-NEXT: [[CMP2:%.*]] = icmp slt <2 x i32> [[COND]], splat (i32 11) 1153; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP2]]) 1154; CHECK-NEXT: [[CMP3:%.*]] = icmp sgt <2 x i32> [[COND]], splat (i32 10) 1155; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP3]]) 1156; CHECK-NEXT: [[CMP4:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 9) 1157; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP4]]) 1158; CHECK-NEXT: [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10) 1159; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP5]]) 1160; CHECK-NEXT: [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11) 1161; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP6]]) 1162; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10) 1163; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP7]]) 1164; CHECK-NEXT: [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9) 1165; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP8]]) 1166; CHECK-NEXT: [[CMP9:%.*]] = icmp eq <2 x i32> [[COND]], splat (i32 10) 1167; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP9]]) 1168; CHECK-NEXT: [[CMP10:%.*]] = icmp ne <2 x i32> [[COND]], splat (i32 10) 1169; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP10]]) 1170; CHECK-NEXT: ret void 1171; 1172 %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 15, i32 10>, <2 x i32> %y) 1173 %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10> 1174 call void @use_v2i1(<2 x i1> %cmp1) 1175 %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10> 1176 call void @use_v2i1(<2 x i1> %cmp2) 1177 %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10> 1178 call void @use_v2i1(<2 x i1> %cmp3) 1179 %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10> 1180 call void @use_v2i1(<2 x i1> %cmp4) 1181 %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10> 1182 call void @use_v2i1(<2 x i1> %cmp5) 1183 %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10> 1184 call void @use_v2i1(<2 x i1> %cmp6) 1185 %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10> 1186 call void @use_v2i1(<2 x i1> %cmp7) 1187 %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10> 1188 call void @use_v2i1(<2 x i1> %cmp8) 1189 %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10> 1190 call void @use_v2i1(<2 x i1> %cmp9) 1191 %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10> 1192 call void @use_v2i1(<2 x i1> %cmp10) 1193 ret void 1194} 1195 1196; icmp pred smin(C1, Y), C2 where (icmp pred' C1, C2) is not a constant splat for all pred' 1197define void @unknown_smin_v2i32_constant(<2 x i32> %y) { 1198; CHECK-LABEL: @unknown_smin_v2i32_constant( 1199; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> <i32 5, i32 15>) 1200; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], splat (i32 10) 1201; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP1]]) 1202; CHECK-NEXT: [[CMP2:%.*]] = icmp slt <2 x i32> [[COND]], splat (i32 11) 1203; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP2]]) 1204; CHECK-NEXT: [[CMP3:%.*]] = icmp sgt <2 x i32> [[COND]], splat (i32 10) 1205; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP3]]) 1206; CHECK-NEXT: [[CMP4:%.*]] = icmp sgt <2 x i32> [[COND]], splat (i32 9) 1207; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP4]]) 1208; CHECK-NEXT: [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10) 1209; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP5]]) 1210; CHECK-NEXT: [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11) 1211; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP6]]) 1212; CHECK-NEXT: [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10) 1213; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP7]]) 1214; CHECK-NEXT: [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9) 1215; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP8]]) 1216; CHECK-NEXT: [[CMP9:%.*]] = icmp eq <2 x i32> [[COND]], splat (i32 10) 1217; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP9]]) 1218; CHECK-NEXT: [[CMP10:%.*]] = icmp ne <2 x i32> [[COND]], splat (i32 10) 1219; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP10]]) 1220; CHECK-NEXT: ret void 1221; 1222 %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 5, i32 15>, <2 x i32> %y) 1223 %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10> 1224 call void @use_v2i1(<2 x i1> %cmp1) 1225 %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10> 1226 call void @use_v2i1(<2 x i1> %cmp2) 1227 %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10> 1228 call void @use_v2i1(<2 x i1> %cmp3) 1229 %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10> 1230 call void @use_v2i1(<2 x i1> %cmp4) 1231 %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10> 1232 call void @use_v2i1(<2 x i1> %cmp5) 1233 %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10> 1234 call void @use_v2i1(<2 x i1> %cmp6) 1235 %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10> 1236 call void @use_v2i1(<2 x i1> %cmp7) 1237 %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10> 1238 call void @use_v2i1(<2 x i1> %cmp8) 1239 %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10> 1240 call void @use_v2i1(<2 x i1> %cmp9) 1241 %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10> 1242 call void @use_v2i1(<2 x i1> %cmp10) 1243 ret void 1244} 1245 1246; Test cases from PR62898 1247 1248define i1 @smin_or_bitwise(i32 %x) { 1249; CHECK-LABEL: @smin_or_bitwise( 1250; CHECK-NEXT: [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 1) 1251; CHECK-NEXT: [[LOBIT:%.*]] = or i32 [[COND]], [[X]] 1252; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[LOBIT]], 0 1253; CHECK-NEXT: ret i1 [[TOBOOL]] 1254; 1255 %cond = tail call i32 @llvm.smin.i32(i32 %x, i32 1) 1256 %lobit = or i32 %cond, %x 1257 %tobool = icmp slt i32 %lobit, 0 1258 ret i1 %tobool 1259} 1260 1261define i1 @smin_and_bitwise(i32 %x) { 1262; CHECK-LABEL: @smin_and_bitwise( 1263; CHECK-NEXT: [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 1) 1264; CHECK-NEXT: [[LOBIT:%.*]] = and i32 [[COND]], [[X]] 1265; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[LOBIT]], 0 1266; CHECK-NEXT: ret i1 [[TOBOOL]] 1267; 1268 %cond = tail call i32 @llvm.smin.i32(i32 %x, i32 1) 1269 %lobit = and i32 %cond, %x 1270 %tobool = icmp slt i32 %lobit, 0 1271 ret i1 %tobool 1272} 1273 1274; try to fold icmp eq smin(X, Y), Z 1275; pre-condition X != Z 1276; X < Z fail 1277; swap X and Y 1278; pre-condition Y != Z fail 1279; Y < Z fail 1280define i1 @eq_smin_nofold(i32 %x) { 1281; CHECK-LABEL: @eq_smin_nofold( 1282; CHECK-NEXT: [[COND:%.*]] = icmp ne i32 [[X:%.*]], 5 1283; CHECK-NEXT: call void @llvm.assume(i1 [[COND]]) 1284; CHECK-NEXT: [[MINV:%.*]] = tail call i32 @llvm.smin.i32(i32 [[X]], i32 5) 1285; CHECK-NEXT: [[RET:%.*]] = icmp eq i32 [[MINV]], 5 1286; CHECK-NEXT: ret i1 [[RET]] 1287; 1288 %cond = icmp ne i32 %x, 5 1289 call void @llvm.assume(i1 %cond) 1290 %minv = tail call i32 @llvm.smin.i32(i32 %x, i32 5) 1291 %ret = icmp eq i32 %minv, 5 1292 ret i1 %ret 1293} 1294 1295declare void @llvm.assume(i1) 1296declare i32 @llvm.smin.i32(i32, i32) 1297declare <2 x i32> @llvm.smin.v2i32(<2 x i32>, <2 x i32>) 1298