1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -instcombine -S | FileCheck %s 3 4; There are 12 basic patterns (or 6 with DeMorganized equivalent) with 5; 2 (commute logic op) * 6; 2 (swap compare operands) * 7; 2 (signed/unsigned) 8; variations for a total of 96 tests. 9 10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 11; 12; (X == MAX) && (X < Y) --> false 13; 14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 15 16define i1 @slt_and_max(i8 %x, i8 %y) { 17; CHECK-LABEL: @slt_and_max( 18; CHECK-NEXT: ret i1 false 19; 20 %cmp = icmp slt i8 %x, %y 21 %cmpeq = icmp eq i8 %x, 127 22 %r = and i1 %cmp, %cmpeq 23 ret i1 %r 24} 25 26define <2 x i1> @slt_and_max_commute(<2 x i8> %x, <2 x i8> %y) { 27; CHECK-LABEL: @slt_and_max_commute( 28; CHECK-NEXT: ret <2 x i1> zeroinitializer 29; 30 %cmp = icmp slt <2 x i8> %x, %y 31 %cmpeq = icmp eq <2 x i8> %x, <i8 127, i8 127> 32 %r = and <2 x i1> %cmpeq, %cmp 33 ret <2 x i1> %r 34} 35 36define i1 @slt_swap_and_max(i8 %x, i8 %y) { 37; CHECK-LABEL: @slt_swap_and_max( 38; CHECK-NEXT: ret i1 false 39; 40 %cmp = icmp sgt i8 %y, %x 41 %cmpeq = icmp eq i8 %x, 127 42 %r = and i1 %cmp, %cmpeq 43 ret i1 %r 44} 45 46define i1 @slt_swap_and_max_commute(i8 %x, i8 %y) { 47; CHECK-LABEL: @slt_swap_and_max_commute( 48; CHECK-NEXT: ret i1 false 49; 50 %cmp = icmp sgt i8 %y, %x 51 %cmpeq = icmp eq i8 %x, 127 52 %r = and i1 %cmpeq, %cmp 53 ret i1 %r 54} 55 56define i1 @ult_and_max(i8 %x, i8 %y) { 57; CHECK-LABEL: @ult_and_max( 58; CHECK-NEXT: ret i1 false 59; 60 %cmp = icmp ult i8 %x, %y 61 %cmpeq = icmp eq i8 %x, 255 62 %r = and i1 %cmp, %cmpeq 63 ret i1 %r 64} 65 66define i1 @ult_and_max_commute(i8 %x, i8 %y) { 67; CHECK-LABEL: @ult_and_max_commute( 68; CHECK-NEXT: ret i1 false 69; 70 %cmp = icmp ult i8 %x, %y 71 %cmpeq = icmp eq i8 %x, 255 72 %r = and i1 %cmpeq, %cmp 73 ret i1 %r 74} 75 76define i1 @ult_swap_and_max(i8 %x, i8 %y) { 77; CHECK-LABEL: @ult_swap_and_max( 78; CHECK-NEXT: ret i1 false 79; 80 %cmp = icmp ugt i8 %y, %x 81 %cmpeq = icmp eq i8 %x, 255 82 %r = and i1 %cmp, %cmpeq 83 ret i1 %r 84} 85 86define i1 @ult_swap_and_max_commute(i8 %x, i8 %y) { 87; CHECK-LABEL: @ult_swap_and_max_commute( 88; CHECK-NEXT: ret i1 false 89; 90 %cmp = icmp ugt i8 %y, %x 91 %cmpeq = icmp eq i8 %x, 255 92 %r = and i1 %cmpeq, %cmp 93 ret i1 %r 94} 95 96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 97; 98; (X == MIN) && (X > Y) --> false 99; 100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 101 102define i1 @sgt_and_min(i9 %x, i9 %y) { 103; CHECK-LABEL: @sgt_and_min( 104; CHECK-NEXT: ret i1 false 105; 106 %cmp = icmp sgt i9 %x, %y 107 %cmpeq = icmp eq i9 %x, 256 108 %r = and i1 %cmp, %cmpeq 109 ret i1 %r 110} 111 112define i1 @sgt_and_min_commute(i8 %x, i8 %y) { 113; CHECK-LABEL: @sgt_and_min_commute( 114; CHECK-NEXT: ret i1 false 115; 116 %cmp = icmp sgt i8 %x, %y 117 %cmpeq = icmp eq i8 %x, 128 118 %r = and i1 %cmpeq, %cmp 119 ret i1 %r 120} 121 122define i1 @sgt_swap_and_min(i8 %x, i8 %y) { 123; CHECK-LABEL: @sgt_swap_and_min( 124; CHECK-NEXT: ret i1 false 125; 126 %cmp = icmp slt i8 %y, %x 127 %cmpeq = icmp eq i8 %x, 128 128 %r = and i1 %cmp, %cmpeq 129 ret i1 %r 130} 131 132define i1 @sgt_swap_and_min_commute(i8 %x, i8 %y) { 133; CHECK-LABEL: @sgt_swap_and_min_commute( 134; CHECK-NEXT: ret i1 false 135; 136 %cmp = icmp slt i8 %y, %x 137 %cmpeq = icmp eq i8 %x, 128 138 %r = and i1 %cmpeq, %cmp 139 ret i1 %r 140} 141 142define i1 @ugt_and_min(i8 %x, i8 %y) { 143; CHECK-LABEL: @ugt_and_min( 144; CHECK-NEXT: ret i1 false 145; 146 %cmp = icmp ugt i8 %x, %y 147 %cmpeq = icmp eq i8 %x, 0 148 %r = and i1 %cmp, %cmpeq 149 ret i1 %r 150} 151 152define i1 @ugt_and_min_commute(i8 %x, i8 %y) { 153; CHECK-LABEL: @ugt_and_min_commute( 154; CHECK-NEXT: ret i1 false 155; 156 %cmp = icmp ugt i8 %x, %y 157 %cmpeq = icmp eq i8 %x, 0 158 %r = and i1 %cmpeq, %cmp 159 ret i1 %r 160} 161 162define i1 @ugt_swap_and_min(i8 %x, i8 %y) { 163; CHECK-LABEL: @ugt_swap_and_min( 164; CHECK-NEXT: ret i1 false 165; 166 %cmp = icmp ult i8 %y, %x 167 %cmpeq = icmp eq i8 %x, 0 168 %r = and i1 %cmp, %cmpeq 169 ret i1 %r 170} 171 172define i1 @ugt_swap_and_min_commute(i8 %x, i8 %y) { 173; CHECK-LABEL: @ugt_swap_and_min_commute( 174; CHECK-NEXT: ret i1 false 175; 176 %cmp = icmp ult i8 %y, %x 177 %cmpeq = icmp eq i8 %x, 0 178 %r = and i1 %cmpeq, %cmp 179 ret i1 %r 180} 181 182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 183; 184; (X != MAX) || (X >= Y) --> true 185; 186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 187 188define i1 @sge_or_not_max(i8 %x, i8 %y) { 189; CHECK-LABEL: @sge_or_not_max( 190; CHECK-NEXT: ret i1 true 191; 192 %cmp = icmp sge i8 %x, %y 193 %cmpeq = icmp ne i8 %x, 127 194 %r = or i1 %cmp, %cmpeq 195 ret i1 %r 196} 197 198define i1 @sge_or_not_max_commute(i8 %x, i8 %y) { 199; CHECK-LABEL: @sge_or_not_max_commute( 200; CHECK-NEXT: ret i1 true 201; 202 %cmp = icmp sge i8 %x, %y 203 %cmpeq = icmp ne i8 %x, 127 204 %r = or i1 %cmpeq, %cmp 205 ret i1 %r 206} 207 208define i1 @sge_swap_or_not_max(i8 %x, i8 %y) { 209; CHECK-LABEL: @sge_swap_or_not_max( 210; CHECK-NEXT: ret i1 true 211; 212 %cmp = icmp sle i8 %y, %x 213 %cmpeq = icmp ne i8 %x, 127 214 %r = or i1 %cmp, %cmpeq 215 ret i1 %r 216} 217 218define i1 @sge_swap_or_not_max_commute(i8 %x, i8 %y) { 219; CHECK-LABEL: @sge_swap_or_not_max_commute( 220; CHECK-NEXT: ret i1 true 221; 222 %cmp = icmp sle i8 %y, %x 223 %cmpeq = icmp ne i8 %x, 127 224 %r = or i1 %cmpeq, %cmp 225 ret i1 %r 226} 227 228define i1 @uge_or_not_max(i8 %x, i8 %y) { 229; CHECK-LABEL: @uge_or_not_max( 230; CHECK-NEXT: ret i1 true 231; 232 %cmp = icmp uge i8 %x, %y 233 %cmpeq = icmp ne i8 %x, 255 234 %r = or i1 %cmp, %cmpeq 235 ret i1 %r 236} 237 238define i1 @uge_or_not_max_commute(i8 %x, i8 %y) { 239; CHECK-LABEL: @uge_or_not_max_commute( 240; CHECK-NEXT: ret i1 true 241; 242 %cmp = icmp uge i8 %x, %y 243 %cmpeq = icmp ne i8 %x, 255 244 %r = or i1 %cmpeq, %cmp 245 ret i1 %r 246} 247 248define i1 @uge_swap_or_not_max(i8 %x, i8 %y) { 249; CHECK-LABEL: @uge_swap_or_not_max( 250; CHECK-NEXT: ret i1 true 251; 252 %cmp = icmp ule i8 %y, %x 253 %cmpeq = icmp ne i8 %x, 255 254 %r = or i1 %cmp, %cmpeq 255 ret i1 %r 256} 257 258define i1 @uge_swap_or_not_max_commute(i8 %x, i8 %y) { 259; CHECK-LABEL: @uge_swap_or_not_max_commute( 260; CHECK-NEXT: ret i1 true 261; 262 %cmp = icmp ule i8 %y, %x 263 %cmpeq = icmp ne i8 %x, 255 264 %r = or i1 %cmpeq, %cmp 265 ret i1 %r 266} 267 268;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 269; 270; (X != MIN) || (X <= Y) --> true 271; 272;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 273 274define i1 @sle_or_not_min(i8 %x, i8 %y) { 275; CHECK-LABEL: @sle_or_not_min( 276; CHECK-NEXT: ret i1 true 277; 278 %cmp = icmp sle i8 %x, %y 279 %cmpeq = icmp ne i8 %x, 128 280 %r = or i1 %cmp, %cmpeq 281 ret i1 %r 282} 283 284define i1 @sle_or_not_min_commute(i8 %x, i8 %y) { 285; CHECK-LABEL: @sle_or_not_min_commute( 286; CHECK-NEXT: ret i1 true 287; 288 %cmp = icmp sle i8 %x, %y 289 %cmpeq = icmp ne i8 %x, 128 290 %r = or i1 %cmpeq, %cmp 291 ret i1 %r 292} 293 294define i1 @sle_swap_or_not_min(i8 %x, i8 %y) { 295; CHECK-LABEL: @sle_swap_or_not_min( 296; CHECK-NEXT: ret i1 true 297; 298 %cmp = icmp sge i8 %y, %x 299 %cmpeq = icmp ne i8 %x, 128 300 %r = or i1 %cmp, %cmpeq 301 ret i1 %r 302} 303 304define i1 @sle_swap_or_not_min_commute(i8 %x, i8 %y) { 305; CHECK-LABEL: @sle_swap_or_not_min_commute( 306; CHECK-NEXT: ret i1 true 307; 308 %cmp = icmp sge i8 %y, %x 309 %cmpeq = icmp ne i8 %x, 128 310 %r = or i1 %cmpeq, %cmp 311 ret i1 %r 312} 313 314define i1 @ule_or_not_min(i427 %x, i427 %y) { 315; CHECK-LABEL: @ule_or_not_min( 316; CHECK-NEXT: ret i1 true 317; 318 %cmp = icmp ule i427 %x, %y 319 %cmpeq = icmp ne i427 %x, 0 320 %r = or i1 %cmp, %cmpeq 321 ret i1 %r 322} 323 324define i1 @ule_or_not_min_commute(i8 %x, i8 %y) { 325; CHECK-LABEL: @ule_or_not_min_commute( 326; CHECK-NEXT: ret i1 true 327; 328 %cmp = icmp ule i8 %x, %y 329 %cmpeq = icmp ne i8 %x, 0 330 %r = or i1 %cmpeq, %cmp 331 ret i1 %r 332} 333 334define i1 @ule_swap_or_not_min(i8 %x, i8 %y) { 335; CHECK-LABEL: @ule_swap_or_not_min( 336; CHECK-NEXT: ret i1 true 337; 338 %cmp = icmp uge i8 %y, %x 339 %cmpeq = icmp ne i8 %x, 0 340 %r = or i1 %cmp, %cmpeq 341 ret i1 %r 342} 343 344define i1 @ule_swap_or_not_min_commute(i8 %x, i8 %y) { 345; CHECK-LABEL: @ule_swap_or_not_min_commute( 346; CHECK-NEXT: ret i1 true 347; 348 %cmp = icmp uge i8 %y, %x 349 %cmpeq = icmp ne i8 %x, 0 350 %r = or i1 %cmpeq, %cmp 351 ret i1 %r 352} 353 354;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 355; 356; (X == MAX) && (X >= Y) --> X == MAX 357; 358;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 359 360define i1 @sge_and_max(i8 %x, i8 %y) { 361; CHECK-LABEL: @sge_and_max( 362; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127 363; CHECK-NEXT: ret i1 [[CMPEQ]] 364; 365 %cmp = icmp sge i8 %x, %y 366 %cmpeq = icmp eq i8 %x, 127 367 %r = and i1 %cmp, %cmpeq 368 ret i1 %r 369} 370 371define i1 @sge_and_max_commute(i8 %x, i8 %y) { 372; CHECK-LABEL: @sge_and_max_commute( 373; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127 374; CHECK-NEXT: ret i1 [[CMPEQ]] 375; 376 %cmp = icmp sge i8 %x, %y 377 %cmpeq = icmp eq i8 %x, 127 378 %r = and i1 %cmpeq, %cmp 379 ret i1 %r 380} 381 382define i1 @sge_swap_and_max(i8 %x, i8 %y) { 383; CHECK-LABEL: @sge_swap_and_max( 384; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127 385; CHECK-NEXT: ret i1 [[CMPEQ]] 386; 387 %cmp = icmp sle i8 %y, %x 388 %cmpeq = icmp eq i8 %x, 127 389 %r = and i1 %cmp, %cmpeq 390 ret i1 %r 391} 392 393define i1 @sge_swap_and_max_commute(i8 %x, i8 %y) { 394; CHECK-LABEL: @sge_swap_and_max_commute( 395; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127 396; CHECK-NEXT: ret i1 [[CMPEQ]] 397; 398 %cmp = icmp sle i8 %y, %x 399 %cmpeq = icmp eq i8 %x, 127 400 %r = and i1 %cmpeq, %cmp 401 ret i1 %r 402} 403 404define i1 @uge_and_max(i8 %x, i8 %y) { 405; CHECK-LABEL: @uge_and_max( 406; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1 407; CHECK-NEXT: ret i1 [[CMPEQ]] 408; 409 %cmp = icmp uge i8 %x, %y 410 %cmpeq = icmp eq i8 %x, 255 411 %r = and i1 %cmp, %cmpeq 412 ret i1 %r 413} 414 415define i1 @uge_and_max_commute(i8 %x, i8 %y) { 416; CHECK-LABEL: @uge_and_max_commute( 417; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1 418; CHECK-NEXT: ret i1 [[CMPEQ]] 419; 420 %cmp = icmp uge i8 %x, %y 421 %cmpeq = icmp eq i8 %x, 255 422 %r = and i1 %cmpeq, %cmp 423 ret i1 %r 424} 425 426define i1 @uge_swap_and_max(i8 %x, i8 %y) { 427; CHECK-LABEL: @uge_swap_and_max( 428; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1 429; CHECK-NEXT: ret i1 [[CMPEQ]] 430; 431 %cmp = icmp ule i8 %y, %x 432 %cmpeq = icmp eq i8 %x, 255 433 %r = and i1 %cmp, %cmpeq 434 ret i1 %r 435} 436 437define i1 @uge_swap_and_max_commute(i8 %x, i8 %y) { 438; CHECK-LABEL: @uge_swap_and_max_commute( 439; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1 440; CHECK-NEXT: ret i1 [[CMPEQ]] 441; 442 %cmp = icmp ule i8 %y, %x 443 %cmpeq = icmp eq i8 %x, 255 444 %r = and i1 %cmpeq, %cmp 445 ret i1 %r 446} 447 448;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 449; 450; (X == MIN) && (X <= Y) --> X == MIN 451; 452;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 453 454define i1 @sle_and_min(i8 %x, i8 %y) { 455; CHECK-LABEL: @sle_and_min( 456; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 457; CHECK-NEXT: ret i1 [[CMPEQ]] 458; 459 %cmp = icmp sle i8 %x, %y 460 %cmpeq = icmp eq i8 %x, 128 461 %r = and i1 %cmp, %cmpeq 462 ret i1 %r 463} 464 465define i1 @sle_and_min_commute(i8 %x, i8 %y) { 466; CHECK-LABEL: @sle_and_min_commute( 467; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 468; CHECK-NEXT: ret i1 [[CMPEQ]] 469; 470 %cmp = icmp sle i8 %x, %y 471 %cmpeq = icmp eq i8 %x, 128 472 %r = and i1 %cmpeq, %cmp 473 ret i1 %r 474} 475 476define i1 @sle_swap_and_min(i8 %x, i8 %y) { 477; CHECK-LABEL: @sle_swap_and_min( 478; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 479; CHECK-NEXT: ret i1 [[CMPEQ]] 480; 481 %cmp = icmp sge i8 %y, %x 482 %cmpeq = icmp eq i8 %x, 128 483 %r = and i1 %cmp, %cmpeq 484 ret i1 %r 485} 486 487define i1 @sle_swap_and_min_commute(i8 %x, i8 %y) { 488; CHECK-LABEL: @sle_swap_and_min_commute( 489; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 490; CHECK-NEXT: ret i1 [[CMPEQ]] 491; 492 %cmp = icmp sge i8 %y, %x 493 %cmpeq = icmp eq i8 %x, 128 494 %r = and i1 %cmpeq, %cmp 495 ret i1 %r 496} 497 498define i1 @ule_and_min(i8 %x, i8 %y) { 499; CHECK-LABEL: @ule_and_min( 500; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0 501; CHECK-NEXT: ret i1 [[CMPEQ]] 502; 503 %cmp = icmp ule i8 %x, %y 504 %cmpeq = icmp eq i8 %x, 0 505 %r = and i1 %cmp, %cmpeq 506 ret i1 %r 507} 508 509define i1 @ule_and_min_commute(i8 %x, i8 %y) { 510; CHECK-LABEL: @ule_and_min_commute( 511; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0 512; CHECK-NEXT: ret i1 [[CMPEQ]] 513; 514 %cmp = icmp ule i8 %x, %y 515 %cmpeq = icmp eq i8 %x, 0 516 %r = and i1 %cmpeq, %cmp 517 ret i1 %r 518} 519 520define i1 @ule_swap_and_min(i8 %x, i8 %y) { 521; CHECK-LABEL: @ule_swap_and_min( 522; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0 523; CHECK-NEXT: ret i1 [[CMPEQ]] 524; 525 %cmp = icmp uge i8 %y, %x 526 %cmpeq = icmp eq i8 %x, 0 527 %r = and i1 %cmp, %cmpeq 528 ret i1 %r 529} 530 531define i1 @ule_swap_and_min_commute(i8 %x, i8 %y) { 532; CHECK-LABEL: @ule_swap_and_min_commute( 533; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0 534; CHECK-NEXT: ret i1 [[CMPEQ]] 535; 536 %cmp = icmp uge i8 %y, %x 537 %cmpeq = icmp eq i8 %x, 0 538 %r = and i1 %cmpeq, %cmp 539 ret i1 %r 540} 541 542;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 543; 544; (X == MAX) || (X >= Y) --> X >= Y 545; 546;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 547 548define i1 @sge_or_max(i8 %x, i8 %y) { 549; CHECK-LABEL: @sge_or_max( 550; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] 551; CHECK-NEXT: ret i1 [[CMP]] 552; 553 %cmp = icmp sge i8 %x, %y 554 %cmpeq = icmp eq i8 %x, 127 555 %r = or i1 %cmp, %cmpeq 556 ret i1 %r 557} 558 559define i1 @sge_or_max_commute(i8 %x, i8 %y) { 560; CHECK-LABEL: @sge_or_max_commute( 561; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] 562; CHECK-NEXT: ret i1 [[CMP]] 563; 564 %cmp = icmp sge i8 %x, %y 565 %cmpeq = icmp eq i8 %x, 127 566 %r = or i1 %cmpeq, %cmp 567 ret i1 %r 568} 569 570define i1 @sge_swap_or_max(i8 %x, i8 %y) { 571; CHECK-LABEL: @sge_swap_or_max( 572; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] 573; CHECK-NEXT: ret i1 [[CMP]] 574; 575 %cmp = icmp sle i8 %y, %x 576 %cmpeq = icmp eq i8 %x, 127 577 %r = or i1 %cmp, %cmpeq 578 ret i1 %r 579} 580 581define i1 @sge_swap_or_max_commute(i8 %x, i8 %y) { 582; CHECK-LABEL: @sge_swap_or_max_commute( 583; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] 584; CHECK-NEXT: ret i1 [[CMP]] 585; 586 %cmp = icmp sle i8 %y, %x 587 %cmpeq = icmp eq i8 %x, 127 588 %r = or i1 %cmpeq, %cmp 589 ret i1 %r 590} 591 592define i1 @uge_or_max(i8 %x, i8 %y) { 593; CHECK-LABEL: @uge_or_max( 594; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] 595; CHECK-NEXT: ret i1 [[CMP]] 596; 597 %cmp = icmp uge i8 %x, %y 598 %cmpeq = icmp eq i8 %x, 255 599 %r = or i1 %cmp, %cmpeq 600 ret i1 %r 601} 602 603define i1 @uge_or_max_commute(i8 %x, i8 %y) { 604; CHECK-LABEL: @uge_or_max_commute( 605; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] 606; CHECK-NEXT: ret i1 [[CMP]] 607; 608 %cmp = icmp uge i8 %x, %y 609 %cmpeq = icmp eq i8 %x, 255 610 %r = or i1 %cmpeq, %cmp 611 ret i1 %r 612} 613 614define i1 @uge_swap_or_max(i8 %x, i8 %y) { 615; CHECK-LABEL: @uge_swap_or_max( 616; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] 617; CHECK-NEXT: ret i1 [[CMP]] 618; 619 %cmp = icmp ule i8 %y, %x 620 %cmpeq = icmp eq i8 %x, 255 621 %r = or i1 %cmp, %cmpeq 622 ret i1 %r 623} 624 625define i1 @uge_swap_or_max_commute(i8 %x, i8 %y) { 626; CHECK-LABEL: @uge_swap_or_max_commute( 627; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] 628; CHECK-NEXT: ret i1 [[CMP]] 629; 630 %cmp = icmp ule i8 %y, %x 631 %cmpeq = icmp eq i8 %x, 255 632 %r = or i1 %cmpeq, %cmp 633 ret i1 %r 634} 635 636;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 637; 638; (X == MIN) || (X <= Y) --> X <= Y 639; 640;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 641 642define i1 @sle_or_min(i8 %x, i8 %y) { 643; CHECK-LABEL: @sle_or_min( 644; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] 645; CHECK-NEXT: ret i1 [[CMP]] 646; 647 %cmp = icmp sle i8 %x, %y 648 %cmpeq = icmp eq i8 %x, 128 649 %r = or i1 %cmp, %cmpeq 650 ret i1 %r 651} 652 653define i1 @sle_or_min_commute(i8 %x, i8 %y) { 654; CHECK-LABEL: @sle_or_min_commute( 655; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] 656; CHECK-NEXT: ret i1 [[CMP]] 657; 658 %cmp = icmp sle i8 %x, %y 659 %cmpeq = icmp eq i8 %x, 128 660 %r = or i1 %cmpeq, %cmp 661 ret i1 %r 662} 663 664define i1 @sle_swap_or_min(i8 %x, i8 %y) { 665; CHECK-LABEL: @sle_swap_or_min( 666; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] 667; CHECK-NEXT: ret i1 [[CMP]] 668; 669 %cmp = icmp sge i8 %y, %x 670 %cmpeq = icmp eq i8 %x, 128 671 %r = or i1 %cmp, %cmpeq 672 ret i1 %r 673} 674 675define i1 @sle_swap_or_min_commute(i8 %x, i8 %y) { 676; CHECK-LABEL: @sle_swap_or_min_commute( 677; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] 678; CHECK-NEXT: ret i1 [[CMP]] 679; 680 %cmp = icmp sge i8 %y, %x 681 %cmpeq = icmp eq i8 %x, 128 682 %r = or i1 %cmpeq, %cmp 683 ret i1 %r 684} 685 686define i1 @ule_or_min(i8 %x, i8 %y) { 687; CHECK-LABEL: @ule_or_min( 688; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] 689; CHECK-NEXT: ret i1 [[CMP]] 690; 691 %cmp = icmp ule i8 %x, %y 692 %cmpeq = icmp eq i8 %x, 0 693 %r = or i1 %cmp, %cmpeq 694 ret i1 %r 695} 696 697define i1 @ule_or_min_commute(i8 %x, i8 %y) { 698; CHECK-LABEL: @ule_or_min_commute( 699; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] 700; CHECK-NEXT: ret i1 [[CMP]] 701; 702 %cmp = icmp ule i8 %x, %y 703 %cmpeq = icmp eq i8 %x, 0 704 %r = or i1 %cmpeq, %cmp 705 ret i1 %r 706} 707 708define i1 @ule_swap_or_min(i8 %x, i8 %y) { 709; CHECK-LABEL: @ule_swap_or_min( 710; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]] 711; CHECK-NEXT: ret i1 [[CMP]] 712; 713 %cmp = icmp uge i8 %y, %x 714 %cmpeq = icmp eq i8 %x, 0 715 %r = or i1 %cmp, %cmpeq 716 ret i1 %r 717} 718 719define i1 @ule_swap_or_min_commute(i8 %x, i8 %y) { 720; CHECK-LABEL: @ule_swap_or_min_commute( 721; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]] 722; CHECK-NEXT: ret i1 [[CMP]] 723; 724 %cmp = icmp uge i8 %y, %x 725 %cmpeq = icmp eq i8 %x, 0 726 %r = or i1 %cmpeq, %cmp 727 ret i1 %r 728} 729 730;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 731; 732; (X != MAX) && (X < Y) --> X < Y 733; 734;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 735 736define i1 @slt_and_not_max(i8 %x, i8 %y) { 737; CHECK-LABEL: @slt_and_not_max( 738; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] 739; CHECK-NEXT: ret i1 [[CMP]] 740; 741 %cmp = icmp slt i8 %x, %y 742 %cmpeq = icmp ne i8 %x, 127 743 %r = and i1 %cmp, %cmpeq 744 ret i1 %r 745} 746 747define i1 @slt_and_not_max_commute(i8 %x, i8 %y) { 748; CHECK-LABEL: @slt_and_not_max_commute( 749; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] 750; CHECK-NEXT: ret i1 [[CMP]] 751; 752 %cmp = icmp slt i8 %x, %y 753 %cmpeq = icmp ne i8 %x, 127 754 %r = and i1 %cmpeq, %cmp 755 ret i1 %r 756} 757 758define i1 @slt_swap_and_not_max(i8 %x, i8 %y) { 759; CHECK-LABEL: @slt_swap_and_not_max( 760; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] 761; CHECK-NEXT: ret i1 [[CMP]] 762; 763 %cmp = icmp sgt i8 %y, %x 764 %cmpeq = icmp ne i8 %x, 127 765 %r = and i1 %cmp, %cmpeq 766 ret i1 %r 767} 768 769define i1 @slt_swap_and_not_max_commute(i8 %x, i8 %y) { 770; CHECK-LABEL: @slt_swap_and_not_max_commute( 771; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] 772; CHECK-NEXT: ret i1 [[CMP]] 773; 774 %cmp = icmp sgt i8 %y, %x 775 %cmpeq = icmp ne i8 %x, 127 776 %r = and i1 %cmpeq, %cmp 777 ret i1 %r 778} 779 780define i1 @ult_and_not_max(i8 %x, i8 %y) { 781; CHECK-LABEL: @ult_and_not_max( 782; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] 783; CHECK-NEXT: ret i1 [[CMP]] 784; 785 %cmp = icmp ult i8 %x, %y 786 %cmpeq = icmp ne i8 %x, 255 787 %r = and i1 %cmp, %cmpeq 788 ret i1 %r 789} 790 791define i1 @ult_and_not_max_commute(i8 %x, i8 %y) { 792; CHECK-LABEL: @ult_and_not_max_commute( 793; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] 794; CHECK-NEXT: ret i1 [[CMP]] 795; 796 %cmp = icmp ult i8 %x, %y 797 %cmpeq = icmp ne i8 %x, 255 798 %r = and i1 %cmpeq, %cmp 799 ret i1 %r 800} 801 802define i1 @ult_swap_and_not_max(i8 %x, i8 %y) { 803; CHECK-LABEL: @ult_swap_and_not_max( 804; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] 805; CHECK-NEXT: ret i1 [[CMP]] 806; 807 %cmp = icmp ugt i8 %y, %x 808 %cmpeq = icmp ne i8 %x, 255 809 %r = and i1 %cmp, %cmpeq 810 ret i1 %r 811} 812 813define i1 @ult_swap_and_not_max_commute(i8 %x, i8 %y) { 814; CHECK-LABEL: @ult_swap_and_not_max_commute( 815; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] 816; CHECK-NEXT: ret i1 [[CMP]] 817; 818 %cmp = icmp ugt i8 %y, %x 819 %cmpeq = icmp ne i8 %x, 255 820 %r = and i1 %cmpeq, %cmp 821 ret i1 %r 822} 823 824;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 825; 826; (X != MIN) && (X > Y) --> X > Y 827; 828;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 829 830define i1 @sgt_and_not_min(i8 %x, i8 %y) { 831; CHECK-LABEL: @sgt_and_not_min( 832; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] 833; CHECK-NEXT: ret i1 [[CMP]] 834; 835 %cmp = icmp sgt i8 %x, %y 836 %cmpeq = icmp ne i8 %x, 128 837 %r = and i1 %cmp, %cmpeq 838 ret i1 %r 839} 840 841define i1 @sgt_and_not_min_commute(i8 %x, i8 %y) { 842; CHECK-LABEL: @sgt_and_not_min_commute( 843; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] 844; CHECK-NEXT: ret i1 [[CMP]] 845; 846 %cmp = icmp sgt i8 %x, %y 847 %cmpeq = icmp ne i8 %x, 128 848 %r = and i1 %cmpeq, %cmp 849 ret i1 %r 850} 851 852define i1 @sgt_swap_and_not_min(i8 %x, i8 %y) { 853; CHECK-LABEL: @sgt_swap_and_not_min( 854; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] 855; CHECK-NEXT: ret i1 [[CMP]] 856; 857 %cmp = icmp slt i8 %y, %x 858 %cmpeq = icmp ne i8 %x, 128 859 %r = and i1 %cmp, %cmpeq 860 ret i1 %r 861} 862 863define i1 @sgt_swap_and_not_min_commute(i8 %x, i8 %y) { 864; CHECK-LABEL: @sgt_swap_and_not_min_commute( 865; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] 866; CHECK-NEXT: ret i1 [[CMP]] 867; 868 %cmp = icmp slt i8 %y, %x 869 %cmpeq = icmp ne i8 %x, 128 870 %r = and i1 %cmpeq, %cmp 871 ret i1 %r 872} 873 874define i1 @ugt_and_not_min(i8 %x, i8 %y) { 875; CHECK-LABEL: @ugt_and_not_min( 876; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]] 877; CHECK-NEXT: ret i1 [[CMP]] 878; 879 %cmp = icmp ugt i8 %x, %y 880 %cmpeq = icmp ne i8 %x, 0 881 %r = and i1 %cmp, %cmpeq 882 ret i1 %r 883} 884 885define i1 @ugt_and_not_min_commute(i8 %x, i8 %y) { 886; CHECK-LABEL: @ugt_and_not_min_commute( 887; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]] 888; CHECK-NEXT: ret i1 [[CMP]] 889; 890 %cmp = icmp ugt i8 %x, %y 891 %cmpeq = icmp ne i8 %x, 0 892 %r = and i1 %cmpeq, %cmp 893 ret i1 %r 894} 895 896define i1 @ugt_swap_and_not_min(i8 %x, i8 %y) { 897; CHECK-LABEL: @ugt_swap_and_not_min( 898; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]] 899; CHECK-NEXT: ret i1 [[CMP]] 900; 901 %cmp = icmp ult i8 %y, %x 902 %cmpeq = icmp ne i8 %x, 0 903 %r = and i1 %cmp, %cmpeq 904 ret i1 %r 905} 906 907define i1 @ugt_swap_and_not_min_commute(i8 %x, i8 %y) { 908; CHECK-LABEL: @ugt_swap_and_not_min_commute( 909; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]] 910; CHECK-NEXT: ret i1 [[CMP]] 911; 912 %cmp = icmp ult i8 %y, %x 913 %cmpeq = icmp ne i8 %x, 0 914 %r = and i1 %cmpeq, %cmp 915 ret i1 %r 916} 917 918;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 919; 920; (X != MAX) || (X < Y) --> X != MAX 921; 922;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 923 924define i1 @slt_or_not_max(i8 %x, i8 %y) { 925; CHECK-LABEL: @slt_or_not_max( 926; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 927; CHECK-NEXT: ret i1 [[CMPEQ]] 928; 929 %cmp = icmp slt i8 %x, %y 930 %cmpeq = icmp ne i8 %x, 127 931 %r = or i1 %cmp, %cmpeq 932 ret i1 %r 933} 934 935define i1 @slt_or_not_max_commute(i8 %x, i8 %y) { 936; CHECK-LABEL: @slt_or_not_max_commute( 937; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 938; CHECK-NEXT: ret i1 [[CMPEQ]] 939; 940 %cmp = icmp slt i8 %x, %y 941 %cmpeq = icmp ne i8 %x, 127 942 %r = or i1 %cmpeq, %cmp 943 ret i1 %r 944} 945 946define i1 @slt_swap_or_not_max(i8 %x, i8 %y) { 947; CHECK-LABEL: @slt_swap_or_not_max( 948; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 949; CHECK-NEXT: ret i1 [[CMPEQ]] 950; 951 %cmp = icmp sgt i8 %y, %x 952 %cmpeq = icmp ne i8 %x, 127 953 %r = or i1 %cmp, %cmpeq 954 ret i1 %r 955} 956 957define i1 @slt_swap_or_not_max_commute(i8 %x, i8 %y) { 958; CHECK-LABEL: @slt_swap_or_not_max_commute( 959; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 960; CHECK-NEXT: ret i1 [[CMPEQ]] 961; 962 %cmp = icmp sgt i8 %y, %x 963 %cmpeq = icmp ne i8 %x, 127 964 %r = or i1 %cmpeq, %cmp 965 ret i1 %r 966} 967 968define i1 @ult_or_not_max(i8 %x, i8 %y) { 969; CHECK-LABEL: @ult_or_not_max( 970; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 971; CHECK-NEXT: ret i1 [[CMPEQ]] 972; 973 %cmp = icmp ult i8 %x, %y 974 %cmpeq = icmp ne i8 %x, 255 975 %r = or i1 %cmp, %cmpeq 976 ret i1 %r 977} 978 979define i1 @ult_or_not_max_commute(i8 %x, i8 %y) { 980; CHECK-LABEL: @ult_or_not_max_commute( 981; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 982; CHECK-NEXT: ret i1 [[CMPEQ]] 983; 984 %cmp = icmp ult i8 %x, %y 985 %cmpeq = icmp ne i8 %x, 255 986 %r = or i1 %cmpeq, %cmp 987 ret i1 %r 988} 989 990define i1 @ult_swap_or_not_max(i8 %x, i8 %y) { 991; CHECK-LABEL: @ult_swap_or_not_max( 992; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 993; CHECK-NEXT: ret i1 [[CMPEQ]] 994; 995 %cmp = icmp ugt i8 %y, %x 996 %cmpeq = icmp ne i8 %x, 255 997 %r = or i1 %cmp, %cmpeq 998 ret i1 %r 999} 1000 1001define i1 @ult_swap_or_not_max_commute(i8 %x, i8 %y) { 1002; CHECK-LABEL: @ult_swap_or_not_max_commute( 1003; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 1004; CHECK-NEXT: ret i1 [[CMPEQ]] 1005; 1006 %cmp = icmp ugt i8 %y, %x 1007 %cmpeq = icmp ne i8 %x, 255 1008 %r = or i1 %cmpeq, %cmp 1009 ret i1 %r 1010} 1011 1012;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1013; 1014; (X != MIN) || (X > Y) --> X != MIN 1015; 1016;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1017 1018define i1 @sgt_or_not_min(i8 %x, i8 %y) { 1019; CHECK-LABEL: @sgt_or_not_min( 1020; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 1021; CHECK-NEXT: ret i1 [[CMPEQ]] 1022; 1023 %cmp = icmp sgt i8 %x, %y 1024 %cmpeq = icmp ne i8 %x, 128 1025 %r = or i1 %cmp, %cmpeq 1026 ret i1 %r 1027} 1028 1029define i1 @sgt_or_not_min_commute(i8 %x, i8 %y) { 1030; CHECK-LABEL: @sgt_or_not_min_commute( 1031; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 1032; CHECK-NEXT: ret i1 [[CMPEQ]] 1033; 1034 %cmp = icmp sgt i8 %x, %y 1035 %cmpeq = icmp ne i8 %x, 128 1036 %r = or i1 %cmpeq, %cmp 1037 ret i1 %r 1038} 1039 1040define i1 @sgt_swap_or_not_min(i8 %x, i8 %y) { 1041; CHECK-LABEL: @sgt_swap_or_not_min( 1042; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 1043; CHECK-NEXT: ret i1 [[CMPEQ]] 1044; 1045 %cmp = icmp slt i8 %y, %x 1046 %cmpeq = icmp ne i8 %x, 128 1047 %r = or i1 %cmp, %cmpeq 1048 ret i1 %r 1049} 1050 1051define i1 @sgt_swap_or_not_min_commute(i8 %x, i8 %y) { 1052; CHECK-LABEL: @sgt_swap_or_not_min_commute( 1053; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 1054; CHECK-NEXT: ret i1 [[CMPEQ]] 1055; 1056 %cmp = icmp slt i8 %y, %x 1057 %cmpeq = icmp ne i8 %x, 128 1058 %r = or i1 %cmpeq, %cmp 1059 ret i1 %r 1060} 1061 1062define i1 @ugt_or_not_min(i8 %x, i8 %y) { 1063; CHECK-LABEL: @ugt_or_not_min( 1064; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0 1065; CHECK-NEXT: ret i1 [[CMPEQ]] 1066; 1067 %cmp = icmp ugt i8 %x, %y 1068 %cmpeq = icmp ne i8 %x, 0 1069 %r = or i1 %cmp, %cmpeq 1070 ret i1 %r 1071} 1072 1073define i1 @ugt_or_not_min_commute(i8 %x, i8 %y) { 1074; CHECK-LABEL: @ugt_or_not_min_commute( 1075; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0 1076; CHECK-NEXT: ret i1 [[CMPEQ]] 1077; 1078 %cmp = icmp ugt i8 %x, %y 1079 %cmpeq = icmp ne i8 %x, 0 1080 %r = or i1 %cmpeq, %cmp 1081 ret i1 %r 1082} 1083 1084define i1 @ugt_swap_or_not_min(i8 %x, i8 %y) { 1085; CHECK-LABEL: @ugt_swap_or_not_min( 1086; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0 1087; CHECK-NEXT: ret i1 [[CMPEQ]] 1088; 1089 %cmp = icmp ult i8 %y, %x 1090 %cmpeq = icmp ne i8 %x, 0 1091 %r = or i1 %cmp, %cmpeq 1092 ret i1 %r 1093} 1094 1095define i1 @ugt_swap_or_not_min_commute(i823 %x, i823 %y) { 1096; CHECK-LABEL: @ugt_swap_or_not_min_commute( 1097; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i823 [[X:%.*]], 0 1098; CHECK-NEXT: ret i1 [[CMPEQ]] 1099; 1100 %cmp = icmp ult i823 %y, %x 1101 %cmpeq = icmp ne i823 %x, 0 1102 %r = or i1 %cmpeq, %cmp 1103 ret i1 %r 1104} 1105