1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4define i1 @compare_unsigned_min(i8 %x, i8 %y) { 5; CHECK-LABEL: define i1 @compare_unsigned_min( 6; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 7; CHECK-NEXT: [[START:.*:]] 8; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i8 [[X]], [[Y]] 9; CHECK-NEXT: ret i1 [[TMP2]] 10; 11start: 12 %cmp1 = icmp eq i8 %x, 0 13 %cmp2 = icmp ne i8 %y, 0 14 %cmp3 = icmp ult i8 %x, %y 15 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 16 ret i1 %result 17} 18 19define i1 @compare_signed_min(i8 %x, i8 %y) { 20; CHECK-LABEL: define i1 @compare_signed_min( 21; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 22; CHECK-NEXT: [[START:.*:]] 23; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]] 24; CHECK-NEXT: ret i1 [[TMP4]] 25; 26start: 27 %cmp1 = icmp eq i8 %x, -128 28 %cmp2 = icmp ne i8 %y, -128 29 %cmp3 = icmp slt i8 %x, %y 30 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 31 ret i1 %result 32} 33 34define i1 @compare_unsigned_max(i8 %x, i8 %y) { 35; CHECK-LABEL: define i1 @compare_unsigned_max( 36; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 37; CHECK-NEXT: [[START:.*:]] 38; CHECK-NEXT: [[TMP4:%.*]] = icmp ugt i8 [[X]], [[Y]] 39; CHECK-NEXT: ret i1 [[TMP4]] 40; 41start: 42 %cmp1 = icmp eq i8 %x, 255 43 %cmp2 = icmp ne i8 %y, 255 44 %cmp3 = icmp ugt i8 %x, %y 45 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 46 ret i1 %result 47} 48 49define i1 @compare_signed_max(i8 %x, i8 %y) { 50; CHECK-LABEL: define i1 @compare_signed_max( 51; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 52; CHECK-NEXT: [[START:.*:]] 53; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]] 54; CHECK-NEXT: ret i1 [[TMP4]] 55; 56start: 57 %cmp1 = icmp eq i8 %x, 127 58 %cmp2 = icmp ne i8 %y, 127 59 %cmp3 = icmp sgt i8 %x, %y 60 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 61 ret i1 %result 62} 63 64define i1 @relational_cmp_unsigned_min(i8 %x, i8 %y) { 65; CHECK-LABEL: define i1 @relational_cmp_unsigned_min( 66; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 67; CHECK-NEXT: [[START:.*:]] 68; CHECK-NEXT: [[TMP4:%.*]] = icmp ult i8 [[X]], [[Y]] 69; CHECK-NEXT: ret i1 [[TMP4]] 70; 71start: 72 %cmp1 = icmp ule i8 %x, 0 73 %cmp2 = icmp ugt i8 %y, 0 74 %cmp3 = icmp ult i8 %x, %y 75 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 76 ret i1 %result 77} 78 79define i1 @relational_cmp_signed_min(i8 %x, i8 %y) { 80; CHECK-LABEL: define i1 @relational_cmp_signed_min( 81; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 82; CHECK-NEXT: [[START:.*:]] 83; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]] 84; CHECK-NEXT: ret i1 [[TMP4]] 85; 86start: 87 %cmp1 = icmp sle i8 %x, -128 88 %cmp2 = icmp sgt i8 %y, -128 89 %cmp3 = icmp slt i8 %x, %y 90 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 91 ret i1 %result 92} 93 94define i1 @relational_cmp_unsigned_max(i8 %x, i8 %y) { 95; CHECK-LABEL: define i1 @relational_cmp_unsigned_max( 96; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 97; CHECK-NEXT: [[START:.*:]] 98; CHECK-NEXT: [[TMP4:%.*]] = icmp ugt i8 [[X]], [[Y]] 99; CHECK-NEXT: ret i1 [[TMP4]] 100; 101start: 102 %cmp1 = icmp uge i8 %x, 255 103 %cmp2 = icmp ult i8 %y, 255 104 %cmp3 = icmp ugt i8 %x, %y 105 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 106 ret i1 %result 107} 108 109define i1 @relational_cmp_signed_max(i8 %x, i8 %y) { 110; CHECK-LABEL: define i1 @relational_cmp_signed_max( 111; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 112; CHECK-NEXT: [[START:.*:]] 113; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]] 114; CHECK-NEXT: ret i1 [[TMP4]] 115; 116start: 117 %cmp1 = icmp sge i8 %x, 127 118 %cmp2 = icmp slt i8 %y, 127 119 %cmp3 = icmp sgt i8 %x, %y 120 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 121 ret i1 %result 122} 123 124declare void @use(i1) 125 126define i1 @compare_signed_max_multiuse(i8 %x, i8 %y) { 127; CHECK-LABEL: define i1 @compare_signed_max_multiuse( 128; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 129; CHECK-NEXT: [[START:.*:]] 130; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]] 131; CHECK-NEXT: call void @use(i1 [[TMP4]]) 132; CHECK-NEXT: [[RESULT:%.*]] = icmp sgt i8 [[X]], [[Y]] 133; CHECK-NEXT: ret i1 [[RESULT]] 134; 135start: 136 %cmp1 = icmp eq i8 %x, 127 137 %cmp2 = icmp ne i8 %y, 127 138 %cmp3 = icmp sgt i8 %x, %y 139 call void @use(i1 %cmp3) 140 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 141 ret i1 %result 142} 143 144define i1 @compare_signed_min_samesign(i8 %x, i8 %y) { 145; CHECK-LABEL: define i1 @compare_signed_min_samesign( 146; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 147; CHECK-NEXT: [[START:.*:]] 148; CHECK-NEXT: [[RESULT:%.*]] = icmp slt i8 [[X]], [[Y]] 149; CHECK-NEXT: ret i1 [[RESULT]] 150; 151start: 152 %cmp1 = icmp eq i8 %x, -128 153 %cmp2 = icmp ne i8 %y, -128 154 %cmp3 = icmp samesign slt i8 %x, %y 155 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 156 ret i1 %result 157} 158 159define i1 @compare_flipped(i8 %x, i8 %y) { 160; CHECK-LABEL: define i1 @compare_flipped( 161; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 162; CHECK-NEXT: [[START:.*:]] 163; CHECK-NEXT: [[RESULT:%.*]] = icmp ult i8 [[X]], [[Y]] 164; CHECK-NEXT: ret i1 [[RESULT]] 165; 166start: 167 %cmp1 = icmp eq i8 %x, 0 168 %cmp2 = icmp ne i8 %y, 0 169 %cmp3 = icmp ugt i8 %y, %x 170 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 171 ret i1 %result 172} 173 174define i1 @compare_swapped(i8 %x, i8 %y) { 175; CHECK-LABEL: define i1 @compare_swapped( 176; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 177; CHECK-NEXT: [[START:.*:]] 178; CHECK-NEXT: [[RESULT:%.*]] = icmp ult i8 [[X]], [[Y]] 179; CHECK-NEXT: ret i1 [[RESULT]] 180; 181start: 182 %cmp1 = icmp ne i8 %x, 0 183 %cmp2 = icmp ne i8 %y, 0 184 %cmp3 = icmp ult i8 %x, %y 185 %result = select i1 %cmp1, i1 %cmp3, i1 %cmp2 186 ret i1 %result 187} 188 189define i1 @compare_swapped_flipped_unsigned_max(i8 %x, i8 %y) { 190; CHECK-LABEL: define i1 @compare_swapped_flipped_unsigned_max( 191; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 192; CHECK-NEXT: [[START:.*:]] 193; CHECK-NEXT: [[RESULT:%.*]] = icmp ugt i8 [[X]], [[Y]] 194; CHECK-NEXT: ret i1 [[RESULT]] 195; 196start: 197 %cmp1 = icmp ne i8 %x, 255 198 %cmp2 = icmp ne i8 %y, 255 199 %cmp3 = icmp ult i8 %y, %x 200 %result = select i1 %cmp1, i1 %cmp3, i1 %cmp2 201 ret i1 %result 202} 203 204define i1 @compare_unsigned_min_illegal_type(i9 %x, i9 %y) { 205; CHECK-LABEL: define i1 @compare_unsigned_min_illegal_type( 206; CHECK-SAME: i9 [[X:%.*]], i9 [[Y:%.*]]) { 207; CHECK-NEXT: [[START:.*:]] 208; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i9 [[X]], [[Y]] 209; CHECK-NEXT: ret i1 [[TMP2]] 210; 211start: 212 %cmp1 = icmp eq i9 %x, 0 213 %cmp2 = icmp ne i9 %y, 0 214 %cmp3 = icmp ult i9 %x, %y 215 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 216 ret i1 %result 217} 218 219define i1 @compare_true_poison(i8 %x, i8 %y) { 220; CHECK-LABEL: define i1 @compare_true_poison( 221; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 222; CHECK-NEXT: [[START:.*:]] 223; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]] 224; CHECK-NEXT: ret i1 [[CMP3]] 225; 226start: 227 %cmp1 = icmp eq i8 %x, 0 228 %cmp2 = icmp ne i8 %y, 0 229 %cmp3 = icmp ult i8 %x, %y 230 %result = select i1 %cmp1, i1 poison, i1 %cmp3 231 ret i1 %result 232} 233 234define <2 x i1> @compare_vector(<2 x i8> %x, <2 x i8> %y) { 235; CHECK-LABEL: define <2 x i1> @compare_vector( 236; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) { 237; CHECK-NEXT: [[TMP1:%.*]] = icmp ult <2 x i8> [[X]], [[Y]] 238; CHECK-NEXT: ret <2 x i1> [[TMP1]] 239; 240 %cmp1 = icmp eq <2 x i8> %x, zeroinitializer 241 %cmp2 = icmp ne <2 x i8> %y, zeroinitializer 242 %cmp3 = icmp ult <2 x i8> %x, %y 243 %result = select <2 x i1> %cmp1, <2 x i1> %cmp2, <2 x i1> %cmp3 244 ret <2 x i1> %result 245} 246 247define i1 @compare_pointer_negative(ptr %x, ptr %y) { 248; CHECK-LABEL: define i1 @compare_pointer_negative( 249; CHECK-SAME: ptr [[X:%.*]], ptr [[Y:%.*]]) { 250; CHECK-NEXT: [[START:.*:]] 251; CHECK-NEXT: [[TMP2:%.*]] = icmp eq ptr [[X]], inttoptr (i8 127 to ptr) 252; CHECK-NEXT: [[TMP3:%.*]] = icmp ne ptr [[Y]], inttoptr (i8 127 to ptr) 253; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt ptr [[X]], [[Y]] 254; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]] 255; CHECK-NEXT: ret i1 [[RESULT]] 256; 257start: 258 %X = inttoptr i8 127 to ptr 259 %cmp1 = icmp eq ptr %x, %X 260 %cmp2 = icmp ne ptr %y, %X 261 %cmp3 = icmp sgt ptr %x, %y 262 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 263 ret i1 %result 264} 265 266define i1 @compare_float_negative(half %x, half %y) { 267; CHECK-LABEL: define i1 @compare_float_negative( 268; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]]) { 269; CHECK-NEXT: [[START:.*:]] 270; CHECK-NEXT: [[TMP2:%.*]] = fcmp oeq half [[X]], 0xH0000 271; CHECK-NEXT: [[TMP3:%.*]] = fcmp one half [[Y]], 0xH0000 272; CHECK-NEXT: [[TMP4:%.*]] = fcmp ult half [[X]], [[Y]] 273; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]] 274; CHECK-NEXT: ret i1 [[RESULT]] 275; 276start: 277 %cmp1 = fcmp oeq half %x, 0.0 278 %cmp2 = fcmp one half %y, 0.0 279 %cmp3 = fcmp ult half %x, %y 280 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 281 ret i1 %result 282} 283 284define i1 @compare_unsigned_max_swapped_lhs_rhs_negative(i8 %x, i8 %y) { 285; CHECK-LABEL: define i1 @compare_unsigned_max_swapped_lhs_rhs_negative( 286; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 287; CHECK-NEXT: [[START:.*:]] 288; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[X]], -1 289; CHECK-NEXT: [[DOTNOT:%.*]] = icmp ne i8 [[Y]], -1 290; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[DOTNOT]], i1 [[TMP2]], i1 false 291; CHECK-NEXT: ret i1 [[RESULT]] 292; 293start: 294 %cmp1 = icmp eq i8 %x, 255 295 %cmp2 = icmp ne i8 %y, 255 296 %cmp3 = icmp ugt i8 %x, %y 297 %result = select i1 %cmp2, i1 %cmp1, i1 %cmp3 298 ret i1 %result 299} 300 301define i1 @compare_signed_min_negative(i8 %x, i8 %y) { 302; CHECK-LABEL: define i1 @compare_signed_min_negative( 303; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 304; CHECK-NEXT: [[START:.*:]] 305; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[X]], -127 306; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[Y]], -127 307; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]] 308; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]] 309; CHECK-NEXT: ret i1 [[RESULT]] 310; 311start: 312 %cmp1 = icmp eq i8 %x, -127 313 %cmp2 = icmp ne i8 %y, -127 314 %cmp3 = icmp slt i8 %x, %y 315 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 316 ret i1 %result 317} 318 319define i1 @compare_unsigned_max_negative(i8 %x, i8 %y) { 320; CHECK-LABEL: define i1 @compare_unsigned_max_negative( 321; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 322; CHECK-NEXT: [[START:.*:]] 323; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[X]], -1 324; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[Y]], -1 325; CHECK-NEXT: [[TMP4:%.*]] = icmp ult i8 [[X]], [[Y]] 326; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]] 327; CHECK-NEXT: ret i1 [[RESULT]] 328; 329start: 330 %cmp1 = icmp eq i8 %x, 255 331 %cmp2 = icmp ne i8 %y, 255 332 %cmp3 = icmp ult i8 %x, %y 333 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 334 ret i1 %result 335} 336 337define i1 @non_strict_op_negative(i8 %x, i8 %y) { 338; CHECK-LABEL: define i1 @non_strict_op_negative( 339; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 340; CHECK-NEXT: [[START:.*:]] 341; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[X]], 0 342; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[Y]], 0 343; CHECK-NEXT: [[TMP4:%.*]] = icmp ule i8 [[X]], [[Y]] 344; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]] 345; CHECK-NEXT: ret i1 [[RESULT]] 346; 347start: 348 %cmp1 = icmp eq i8 %x, 0 349 %cmp2 = icmp ne i8 %y, 0 350 %cmp3 = icmp ule i8 %x, %y 351 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 352 ret i1 %result 353} 354 355define i1 @compare_poison_negative(i8 %x, i8 %y) { 356; CHECK-LABEL: define i1 @compare_poison_negative( 357; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 358; CHECK-NEXT: [[START:.*:]] 359; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 360; CHECK-NEXT: ret i1 [[CMP2]] 361; 362start: 363 %cmp1 = icmp eq i8 %x, 0 364 %cmp2 = icmp ne i8 %y, 0 365 %result = select i1 %cmp1, i1 %cmp2, i1 poison 366 ret i1 %result 367} 368 369define i1 @mismatched_cond_lhs_negative(i8 %x, i8 %y, i8 %z) { 370; CHECK-LABEL: define i1 @mismatched_cond_lhs_negative( 371; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { 372; CHECK-NEXT: [[START:.*:]] 373; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 374; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 375; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[Z]], [[Y]] 376; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] 377; CHECK-NEXT: ret i1 [[RESULT]] 378; 379start: 380 %cmp1 = icmp eq i8 %x, 0 381 %cmp2 = icmp ne i8 %y, 0 382 %cmp3 = icmp ult i8 %z, %y 383 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 384 ret i1 %result 385} 386 387define i1 @mismatched_trueval_lhs_negative(i8 %x, i8 %y, i8 %z) { 388; CHECK-LABEL: define i1 @mismatched_trueval_lhs_negative( 389; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { 390; CHECK-NEXT: [[START:.*:]] 391; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 392; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 393; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Z]] 394; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] 395; CHECK-NEXT: ret i1 [[RESULT]] 396; 397start: 398 %cmp1 = icmp eq i8 %x, 0 399 %cmp2 = icmp ne i8 %y, 0 400 %cmp3 = icmp ult i8 %x, %z 401 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 402 ret i1 %result 403} 404 405define i1 @mismatched_constant_negative(i8 %x, i8 %y) { 406; CHECK-LABEL: define i1 @mismatched_constant_negative( 407; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 408; CHECK-NEXT: [[START:.*:]] 409; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 410; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 2 411; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]] 412; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] 413; CHECK-NEXT: ret i1 [[RESULT]] 414; 415start: 416 %cmp1 = icmp eq i8 %x, 0 417 %cmp2 = icmp ne i8 %y, 2 418 %cmp3 = icmp ult i8 %x, %y 419 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 420 ret i1 %result 421} 422 423define i1 @mismatched_constant_two_negative(i8 %x, i8 %y) { 424; CHECK-LABEL: define i1 @mismatched_constant_two_negative( 425; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 426; CHECK-NEXT: [[START:.*:]] 427; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 2 428; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 429; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]] 430; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] 431; CHECK-NEXT: ret i1 [[RESULT]] 432; 433start: 434 %cmp1 = icmp eq i8 %x, 2 435 %cmp2 = icmp ne i8 %y, 0 436 %cmp3 = icmp ult i8 %x, %y 437 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 438 ret i1 %result 439} 440 441define i1 @compare_eq_eq_negative(i8 %x, i8 %y) { 442; CHECK-LABEL: define i1 @compare_eq_eq_negative( 443; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 444; CHECK-NEXT: [[START:.*:]] 445; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 446; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[Y]], 0 447; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]] 448; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] 449; CHECK-NEXT: ret i1 [[RESULT]] 450; 451start: 452 %cmp1 = icmp eq i8 %x, 0 453 %cmp2 = icmp eq i8 %y, 0 454 %cmp3 = icmp ult i8 %x, %y 455 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 456 ret i1 %result 457} 458